HDU 1425 sort(堆排序)
今天学习排序,冒泡和选择,无视了。。。直接上堆排序。。
1 #include <stdio.h> 2 #include <string.h> 3 #define N 1000001 4 int p[N],n,m; 5 void heapjust(int x,int len) 6 { 7 int i,num; 8 num = p[x]; 9 for(i = x*2;i <= len;i *= 2)//二叉树的左儿子是2*x右儿子是2*x+1 10 { 11 if(i < len&&p[i] < p[i+1])i ++;//判断左右儿子的大小 12 if(num > p[i]) break;//终止条件如果这个数大,就终止循环。 13 p[x] = p[i];//将大的数替换p[x] 14 x = i;//记录i的值 15 } 16 p[x] = num;//最后将被替换的x记录的i值,给上num的值 17 } 18 void heapbuild() 19 { 20 int i,t; 21 for(i = n/2;i >= 1;i --) 22 { 23 heapjust(i,n); 24 } 25 for(i = n;i >= n-m+1;i --)//堆顶总是最大的元素 26 { 27 t = p[1]; 28 p[1] = p[i]; 29 p[i] = t;//交换后p[i]存已经排好的顺序 30 heapjust(1,i-1);//重新调整,堆里面所有元素(共有i-1个) 31 } 32 } 33 int main() 34 { 35 int i; 36 while(scanf("%d%d",&n,&m)!=EOF) 37 { 38 for(i = 1;i <= n;i ++) 39 scanf("%d",&p[i]); 40 heapbuild(); 41 for(i = n;i >= n-m+1;i --) 42 { 43 if(i == n) 44 printf("%d",p[i]); 45 else 46 printf(" %d",p[i]); 47 } 48 printf("\n"); 49 } 50 return 0; 51 }