是直接利用堆结构的特性进行构造的
直接上代码:
package Heap;
public class HeapSort {
public static void heapSort(int[] arr) {
if (arr.length<2||arr==null) {
return;
}
//根据待排序数组生成堆结构
for (int i = 0; i < arr.length; i++) {
HeapInsert(arr,i);
}
//将堆最后一个与堆顶进行交换
int size=arr.length;
change(arr, 0, --size);
while (size>0) {
heapfiy(arr,0,size);
change(arr, 0, --size);
}
}
private static void heapfiy(int[] arr, int index,int size) {
int leftChild=2*index+1;
while (leftChild<size) {
int largest=(((leftChild+1)<size)&&(arr[leftChild+1]>arr[leftChild]))
?leftChild+1:leftChild;
largest=(arr[index]<arr[largest])?largest:index;
if (largest==index) {
break;
}
change(arr, largest, index);
index=largest;
leftChild=2*index+1;
}
}
private static void HeapInsert(int[] arr, int index) {
//用于将所有的父节点都比较一下
while (arr[index]<arr[(index-1)/2]) {
change(arr, index, (index-1)/2);
index=(index-1)/2;
}
}
//定义交换方法
public static void change(int[] arr,int i,int j) {
int tem=arr[i];
arr[i]=arr[j];
arr[j]=tem;
}
}