堆排序思想
- 堆是一种重要的数组结构,为一棵完全二叉树。
- 堆排序就是利用“堆”这种数据结构对数组排序。
代码参考
工具类:
public class Util {
public static void printArray(int[] array){
System.out.print("{");
for(int i = 0;i<array.length;i++){
System.out.print(array[i]);
if(i<array.length - 1){
System.out.print(", ");
}
}
System.out.println("}");
}
public static void exchangeElements(int[] array,int index1,int index2){
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
}
具体实现类:
/*
* 1.构建最大堆
* 2.选择项,并与第0位置元素交换
* 3.由于步骤2的交换可能破坏了最大堆的性质,第0不再是最大元素,需要调用maxHeap调整堆(沉降法),如果需要重复步骤2
* */
public class HeapSort {
public static void main(String[] args) {
int[] array = {50,10,90,30,70,40,80,60,20};
System.out.println("Before Heap:");
Util.printArray(array);
headSort(array);
System.out.println("After Heap:");
Util.printArray(array);
}
public static void headSort(int[] array){
if(array == null || array.length <=1){
return;
}
buildMaxHeap(array);//构造最大堆
Util.printArray(array);
for(int i = array.length-1;i>=1;i--){
Util.exchangeElements(array, 0, i);
maxHeap(array, i, 0);
}
}
private static void buildMaxHeap(int[] array){
if(array == null || array.length<=1){
return;
}
int half = array.length/2;
for(int i = half;i >= 0;i--){
maxHeap(array, array.length, i);
}
}
private static void maxHeap(int[] array,int heapSize,int index){
int left = index*2+1; //左孩子
int right = index*2+2; //右孩子
//取得最大值的索引
int largest = index;//最大值的索引
if(left <heapSize && array[left]>array[index]){
largest = left;
}
if(right <heapSize && array[right]>array[largest]){
largest = right;
}
if(index != largest){
Util.exchangeElements(array, index, largest);
maxHeap(array, heapSize, largest);
}
}
}
如有疑问可以参考《大话数据结构》