数据结构实验之排序四:寻找大富翁

数据结构实验之排序四:寻找大富翁

 Code:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1010;
 4 const int minn = -10001;
 5 
 6 int a[25];
 7 int n,m;
 8 
 9 //堆排序是倒序的
10 //所以要找前m大的要维护小顶堆
11 
12 void HeapAdjust(int s,int mm){
13     int key = s;
14     int l = s*2;
15     int r = s*2+1;
16     if( s<=mm/2 ){//如果是大于mm/2 就是叶子结点了,就不需要调整了
17         //让key指向最有子树中更小的那个
18         if( l<=mm && a[key]>a[l] ) key = l;
19         if( r<=mm && a[key]>a[r] ) key = r;
20         if( key!=s ){
21             int t = a[key];
22             a[key] = a[s];
23             a[s] = t;
24             HeapAdjust(key,mm);
25         }
26     }
27 }
28 
29 int main()
30 {
31     scanf("%d%d",&n,&m);
32     for(int i=1;i<=m;i++){//注意这里现在只存了m个数,维护了一个m个节点的堆,如果是n个节点然后去调整的话就会TLE
33         scanf("%d",&a[i]);
34     }
35     for(int i=m/2;i>0;i--){
36         HeapAdjust(i,m);
37     }
38     for(int i=m+1;i<=n;i++){
39         int x; scanf("%d",&x);
40         if( x>a[1] ){//如果说前维护的这m个元素中的最小的那个元素比当前输入的这个小的话,那么就可以直接删除了,因为他肯定不是前m大的了,然后调整小顶堆维护前m个中的最小值
41             a[1] = x;
42             HeapAdjust(1,m);
43         }
44     }
45     for(int i=m;i>0;i--){//调整,使得从大到小排
46         int t = a[1];
47         a[1] = a[i];
48         a[i] = t;
49         HeapAdjust(1,i-1);
50     }
51 
52     for(int i=1;i<=m;i++){
53         if( i==m ) printf("%d
",a[i]);
54         else printf("%d ",a[i]);
55     }
56     return 0;
57 }
原文地址:https://www.cnblogs.com/wsy107316/p/14047319.html