[排序]堆排序!
挖了好久的坑终于填了进来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 }
这样一写我发现,就是选择排序鸭,从n个数中找到最大的,放到最后,再从n-1个数找到次大的,放到倒数第二个位置上。而堆优化就是每个数只需要和他的孩子们比较就可以。
时间复杂度是 O(nlogn)
无序数组找第K小,堆排序
No matter how you feel, get up , dress up , show up ,and never give up.