又一个高效的排序。
这个排序算法的基础是大根堆的操作。主要用到的基本操作是将元素下移至适当位置。
大根堆即根结点大于叶子结点,通过将一个普通数组的元素从底层开始不断向下移到适当位置,即构造完毕。在排序的时候,通过每次将第一个元素与“最后”的元素交换,再将根结点移到适当的位置。需要注意的是,这个“最后”是指每趟排序都压缩数组后的长度。
另外,由0开始存储元素,左结点是2*i+1,右结点是2*i+2.
public static void heapSort(int[] A){ makeHeap(A); for(int i = A.length-1; i > 0; i --){ swap(A, 0, i); siftDown(A, i, 0); } } private static void siftDown(int[] A, int len, int i){ while(2*i+1 <= len-1){ i = 2*i+1; if(i+1 <= len-1 && A[i] < A[i+1]) i ++; if(A[(i-1)/2] < A[i]) swap(A, (i-1)/2, i); else break; } } private static void makeHeap(int[] A){ //max heap for(int i = (A.length-1-1)/2; i >= 0; i --){ siftDown(A, A.length, i); } }