JAVA-基本排序-堆排序
阿新 • • 發佈:2018-12-14
堆排序
定義
堆是一種特殊的樹形資料結構,其每個節點都有一個值,通常提到的堆都是指一顆完全二叉樹,根結點的值小於(或大於)兩個子節點的值,同時,根節點的兩個子樹也分別是一個堆。
實現思路
1、將待排序的序列構造成一個大頂堆。此時,整個序列的最大值就是堆頂的根節點。 2、將它與堆陣列的末尾元素交換,此時末尾元素就是最大值; 3、然後將剩餘的 n-1 個序列重新構造成一個堆,這樣就會得到 n 個元素中次大的值。 4、將它與堆陣列的次末尾元素交換,此時次末尾元素就是次最大值; 5、如此反覆執行,便能得到一個有序序列了。
程式碼實現
import java.util.Arrays; public class HeapSort { /** * 堆調整 * @param a 待排序的序列 * @param i 待調整的節點 * @param len 待調整序列長度 */ public static void adjustHeap(int[] a, int i, int len) { //初始需要被調整的節點 int temp=a[i]; for (int j = 2 * i; j < len; j *= 2) { //找出孩子節點中值大的節點 if (j < len && a[j] < a[j + 1]) ++j; //如果孩子節點比根節點小則結束迴圈 if (temp >= a[j]) break; //否則將較大的節點放到被調整的節點上 a[i] = a[j]; //記錄需要被調整的節點 i = j; } a[i] = temp; } /** * 堆排序 * @param a */ public static void heapSort(int[] a) { int i; // 構建一個大頂堆 for (i = a.length / 2 - 1; i >= 0; i--) { adjustHeap(a, i, a.length - 1); } // 將堆頂記錄和當前未經排序子序列的最後一個記錄交換 for (i = a.length - 1; i >= 0; i--) { int temp = a[0]; a[0] = a[i]; a[i] = temp; // 將a中前i-1個記錄重新調整為大頂堆 adjustHeap(a, 0, i - 1); } } public static void main(String[] args) { int a[] = { 49,38,65,97,76,13,27,50 }; heapSort(a); System.out.println(Arrays.toString(a)); } }