[排序]堆排序!

挖了好久的坑终于填了进来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)

 

无序数组找第K小,堆排序

找第K小

posted @ 2018-11-29 16:27  kaike  阅读(274)  评论(0编辑  收藏  举报