算法思想:1.將長度為n的待排序的數組進行堆有序化構造成一個大頂堆
2.將根節點與尾節點交換並輸出此時的尾節點
3.將剩余的n -1個節點重新進行堆有序化
4.重復步驟2,步驟3直至構造成一個有序序列
代碼:
#include <stdlib.h> #include <stdio.h> void swap(int K[], int i, int j) { int temp = K[i]; K[i] = K[j]; K[j] = temp; } void HeapAdjust(int k[], int p, int n) { int i, temp; temp = k[p]; for (i = 2 * p; i <= n; i *= 2) //逐漸去找左右孩子結點 { //找到兩個孩子結點中最大的 if (i < n && k[i] < k[i + 1]) i++; //父節點和孩子最大的進行判斷,調整,變為最大堆 if (temp >= k[i]) break; //將父節點數據變為最大的,將原來的數據還是放在temp中, k[p] = k[i]; //若是孩子結點的數據更大,我們會將數據上移,為他插入的點提供位置 p = i; } //當我們在for循環中找到了p子樹中,滿足條件的點,我們就加入數據到該點p,注意:p點原來數據已經被上移動了 //若沒有找到,就是相當於對其值不變 //插入 k[p] = temp; } //大頂堆排序 void HeapSort(int k[], int n) { int i; //首先將無序數列轉換為大頂堆 for (i = n / 2; i > 0; i--) //注意由於是完全二叉樹,所以我們從一半向前構造,傳入父節點 HeapAdjust(k, i, n); //上面大頂堆已經構造完成,我們現在需要排序,每次將最大的元素放入最后 //然后將剩余元素重新構造大頂堆,將最大元素放在剩余最后 for (i = n; i > 1; i--) { swap(k, 1, i); HeapAdjust(k, 1, i - 1); } } int main() { int i; int a[11] = { -1, 5, 2, 6, 0, 3, 9, 1, 7, 4, 8 }; HeapSort(a, 10); for (i = 1; i <= 10; i++) printf("%d ", a[i]); system("pause"); return 0; }
