java排序演算法 堆排序
阿新 • • 發佈:2019-02-02
利用二叉堆排序其實就是迴圈移除頂部元素到陣列末尾,然後利用Sink重建堆的操作。
實現程式碼如下:
public static void headSort(int[] data) {
int n = data.length;
for(int i = 0; i < n; i++) {
creatMaxHeap(data, n - 1 - i);
swap(data, 0 , n - 1 - i);
}
}
建立最大二叉堆:
使用自下而上的方法建立二叉堆的方法為,分別對葉子結點的上一級節點以從上至下的方式重建堆。
由上至下的重新建堆操作:當某一節點比其子節點要小的時候,就違反了二叉堆的定義,需要和其子節點進行交換以重新建堆,直到該節點都大於其子節點為止:public static void creatMaxHeap(int[] data, int lastIndex) { for(int i = (lastIndex - 1) / 2; i >= 0; i--) { sink(data, i, lastIndex); } }
public static void sink(int[] data, int i, int lastIndex) { while(2 * i + 1 <= lastIndex) { int childIndex = 2 * i + 1; if(childIndex < lastIndex) { if(data[childIndex] < data[childIndex + 1]) childIndex++; } if(data[i] > data[childIndex]) break; swap(data, i , childIndex); i = childIndex; } }
附上程式碼:
public class HeatSort { public static void main(String[] args) { int[] data = new int[] {3,2,1,4,6,5}; headSort(data); print(data); } public static void headSort(int[] data) { int n = data.length; for(int i = 0; i < n; i++) { creatMaxHeap(data, n - 1 - i); swap(data, 0 , n - 1 - i); print(data); } } public static void creatMaxHeap(int[] data, int lastIndex) { for(int i = (lastIndex - 1) / 2; i >= 0; i--) { sink(data, i, lastIndex); } } public static void sink(int[] data, int i, int lastIndex) { while(2 * i + 1 <= lastIndex) { int childIndex = 2 * i + 1; if(childIndex < lastIndex) { if(data[childIndex] < data[childIndex + 1]) childIndex++; } if(data[i] > data[childIndex]) break; swap(data, i , childIndex); i = childIndex; } } public static void swap(int[] data, int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } public static void print(int[] data) { for (int i = 0; i < data.length; i++) { System.out.print(data[i] + "\t"); } System.out.println(); } }