大顶堆对应升序排列,小顶堆对应降序排列
过程:
1.根据输入的无序数组,构建堆
2.将构建好的堆的root从堆移除,剩余数据继续调整成堆
/**
* Created by tianhongyan on 2018/4/8.
*/
public class HeapSort {
/**小顶堆 降序排列**/
public void smallHeapSort(int[] array){
for(int i = array.length/2 -1; i >= 0; i--){
smallHeadAdjust(array,i,array.length-1);
}
for(int i=array.length-1;i>=0;i--){
swapArrayItem(array,0,i);
smallHeadAdjust(array,0,i-1);
}
}
/**小顶堆调整过程**/
private void smallHeadAdjust(int[] array, int i, int arrayLength){
int temp=array[i];
for(int k =i*2+1;k<=arrayLength;k=2*k+1 ) {
if(k+1 <= arrayLength && array[k] > array[k+1]){
k++;
}
if(temp>array[k]){
swapArrayItem(array,i,k);
i=k;
}else {
break;
}
}
}
/**大顶堆 升序排列**/
public void bigHeadSort(int[] array){
for(int i=array.length/2-1;i>=0;i--){
bigHeapAdjust(array,i,array.length);
}
for(int i=array.length-1;i>=0;i--){
swapArrayItem(array,0,i);
bigHeapAdjust(array,0,i-1);
}
}
/**大顶堆 调整过程**/
private void bigHeapAdjust(int[] array, int i,int arrayLength){
int temp = array[i];
for(int k = 2*i+1; k<=arrayLength; k=2*k+1){
if(k+1 <= arrayLength && array[k] < array[k+1]){
k++;
}
if(temp < array[k]){
swapArrayItem(array,i,k);
i=k;
}
}
}
/**交换数据**/
private void swapArrayItem(int[] array, int i, int j){
int temp = array[j];
array[j] = array[i];
array[i] = temp;
}
public static void main(String[] args){
int[] array = new int[]{1,2,3,4,5,9,8,7,6};
HeadSort headSort = new HeadSort();
headSort.smallHeapSort(array);//降序排列
System.out.println(Arrays.toString(array));
headSort.bigHeadSort(array);//升序排列
System.out.print(Arrays.toString(array));
}
}