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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }