python學習筆記1 -- 函數語言程式設計之高階函式
阿新 • • 發佈:2020-07-23
堆排序
堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為O(nlogn),它也是不穩定排序。首先簡單瞭解下堆結構。
'''堆'''是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆
堆排序的基本思想是:將待排序序列構造成一個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成一個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到一個有序序列了
堆排序首先進行建堆
建堆完成後進行排序
大致步驟
a.將無需序列構建成一個堆,根據升序降序需求選擇大頂堆或小頂堆;
b.將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;
c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。
public static void heapSort( int []arr){ //將資料整理成大頂堆 for (int i=arr.length/2-1;i>=0;i--){ buildHeapSort(arr,i,arr.length); } for (int j=arr.length-1;j>0;j--){ //把堆頂元素放到陣列最後 swap(arr,0,j); //堆頂放入陣列結尾後 自上而下重新調整陣列 建立新的大頂堆 buildHeapSort(arr,0,j); } }
/** * 整個堆排序最關鍵的地方 * * @param arr 待組堆 * @param start 起始結點 * @param length 堆的長度 */ public static void buildHeapSort(int[] arr, int start, int length) { int temp = arr[start]; //從上到下 將小數下沉到堆底 for (int i = 2 * start + 1; i < length; i = 2 * i + 1) { //判斷左右孩子節點的大小 if (i + 1 < length && arr[i] < arr[i + 1]) { i++; } //父節點與大於父節點的孩子節點進行交換 if (temp < arr[i]) { swap(arr, start, i); start = i; } else { break; //父節點大於它的左節點和右節點 } } }
//用於交換
public static void swap(int[] arr, int x, int y) {
int tem = arr[x];
arr[x] = arr[y];
arr[y] = tem;
}