heap sort(hdu 1425)

http://acm.hdu.edu.cn/showproblem.php?pid=1425

题意:给你n个整数,请按从大到小的顺序输出其中前m大的数。

一看题目,就觉得是用堆排序,如果在n大,m比较小的时候,效率会不错,空间方面:O(m), 时间基本是O(n),当前前题是 m比较小,

如果很大的话,就回到了O(nlgn),

代码如下:

heap sort: time:718MS

View Code
 1 #include<iostream>
 2 using namespace std;
 3 const int N = 1000005;
 4 int a[N];
 5 //index from 0,1,2,3,4.....
 6 int Left(int curr){
 7     return (curr<<1)+1;
 8 }
 9 int Right(int curr){
10     return (curr<<1)+2;
11 }
12 //update the tree with root: p[node], make it a min heap
13 void minHeapify(int p[], int node, int size){
14     //printf("curr:%d, size:%d\n", node, size);
15     int left, right, tmp;
16     int curr = node;
17     //update
18     while( Left(curr) < size-1 ){
19         left = Left(curr);
20         right = Right(curr);
21         //printf("curr:%d,left:%d, right:%d\n",curr, left, right);
22         if(p[left] < p[right] ){
23             if( p[curr] > p[left] ){
24                 tmp = p[curr];
25                 p[curr] = p[left];
26                 p[left] = tmp;
27                 curr = left;
28             }
29             else break;
30         }
31         else{
32             if( p[curr] > p[right] ){
33                 tmp = p[curr];
34                 p[curr] = p[right];
35                 p[right] = tmp;
36                 curr = right;
37             }
38             else break;
39         }
40     }//end of while
41     //if has left node as leaf,then update
42     if(Left(curr) == size-1 && p[curr] > p[Left(curr)]){
43             tmp = p[curr];
44             p[curr] = p[Left(curr)];
45             p[Left(curr)] = tmp;
46     }
47 }//end of minHeapify
48 
49 void buildMinHeap(int p[], int size){
50     for(int i= (size-2)/2; i>=0; i--){
51         minHeapify(p, i, size);
52     }
53 }
54 int main()
55 {
56     int n, m, i, u, k;
57     int tmp;
58     while(cin >> n >> m ){
59         for(i=0; i<m; i++){
60             scanf("%d", &a[i]);
61         }
62         //build heap
63         buildMinHeap(a, m);
64         
65         //printf("before:\n");
66         //for(i=0; i<m; i++) printf("%d ", a[i]);    
67     
68         //process other data
69         for(i=m; i<n; i++){
70             scanf("%d", &u);
71             if(u > a[0]){
72                 a[0] = u;
73                 minHeapify(a,0, m);
74             }
75         }
76         //printf("after:\n");
77         //for(i=0; i<m; i++) printf("%d ", a[i]);    
78         //printf("------------:\n");
79         
80         //print the m max data
81         k = m-1;
82         for(i=0; i<m-1; i++){
83             tmp = a[k];
84             a[k] = a[0];
85             a[0] = tmp;
86             minHeapify(a, 0, k);
87             k--; 
88         }
89         
90         printf("%d", a[0]);
91         for(i=1; i<m; ++i){
92             printf(" %d", a[i]);
93         }
94         printf("\n");
95     }
96 }

标准库的快排 sort(): time:937MS

View Code
 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int N = 1000005;
 5 int a[N];
 6 
 7 
 8 bool cmp(int a, int b){
 9     return a>b;
10 }
11 
12 int main()
13 {
14     int n, m, i, u, k;
15     int tmp;
16     while(cin >> n >> m ){
17         for(i=0; i<n; i++){
18             scanf("%d", &a[i]);
19         }
20     
21         //use stdlib sort
22         sort(a, a+n, cmp);            
23         //output the result
24         printf("%d", a[0]);
25         for(i=1; i<m; ++i){
26             printf(" %d", a[i]);
27         }
28         printf("\n");
29     }
30 }

标准库中的 partial_sort(): time:734MS

View Code
 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int N = 1000005;
 5 int a[N];
 6 
 7 bool cmp(int a, int b){
 8     return a>b;
 9 }
10 
11 int main()
12 {
13     int n, m, i, u, k;
14     int tmp;
15     while(cin >> n >> m ){
16         for(i=0; i<n; i++){
17             scanf("%d", &a[i]);
18         }
19     
20         //use stdlib sort
21         //sort(a, a+n, cmp);            
22         partial_sort(a, a+m, a+n, cmp);
23         //output the result
24         printf("%d", a[0]);
25         for(i=1; i<m; ++i){
26             printf(" %d", a[i]);
27         }
28         printf("\n");
29     }
30 }

 

 

posted @ 2012-08-10 16:13  blong2010  阅读(189)  评论(0编辑  收藏  举报