1. 程式人生 > >[排序]堆排序!

[排序]堆排序!

挖了好久的坑終於填了進來qaq

大頂堆(從小到大排序):

每次調整就是在這個節點上,找他的孩子們是否大於它,如果大於就交換位置,然後再從它的孩子的孩子裡面重複這個過程,保證父親是兩個孩子中最大的,而兩個孩子誰大不一定。

剛開始初始化時,從第一個有孩子的父親點出發,由下到上不斷調整這個堆。

(每次調整都是調整一個父親點及其以下)想要調整所有的父親點,要迴圈了。

然後堆的第一個值就是最大值,把最大值和最後一位交換,然後在從n-1前面的數找最大的,也就是在n個數中次大的,放到n-1的位置上,就這樣一直找。

 1 #include<iostream>
 2
#include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<map> 6 #include<algorithm> 7 #include<cmath> 8 using namespace std; 9 int n, a[110]; 10 void adjust(int i,int n) 11 { 12 int child = 2 * i; 13 while (child <= n) 14 { 15 if
(child + 1 <= n && a[child] < a[child + 1]) 16 child++; 17 if (a[child] < a[i]) 18 break; 19 int t = a[child]; 20 a[child] = a[i]; 21 a[i] = t; 22 i = child; 23 child = 2 * i; 24 } 25 } 26 void dui(int n) 27
{ 28 for (int i = n / 2; i >= 1; i--) 29 adjust(i, n); 30 for (int i = n ; i > 1; i--) 31 { 32 int t = a[1]; 33 a[1] = a[i]; 34 a[i] = t; 35 adjust(1,i-1); 36 } 37 } 38 int main() 39 { 40 cin >> n; 41 for (int i = 1; i <= n; i++) 42 cin >> a[i]; 43 dui(n); 44 for (int i = 1; i <= n; i++) 45 cout << a[i] << " "; 46 47 return 0; 48 }
View Code

這樣一寫我發現,就是選擇排序鴨,從n個數中找到最大的,放到最後,再從n-1個數找到次大的,放到倒數第二個位置上。而堆優化就是每個數只需要和他的孩子們比較就可以。

時間複雜度是 O(nlogn)