HDU1425 sort
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数。 Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。 Output 对每组测试数据按从大到小的顺序输出前m大的数。 Sample Input 5 3 3 -35 92 213 -644 Sample Output 213 92 3
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int a[1000005]; int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=0;i<n;i++){ scanf("%d",&a[i]); } sort(a,a+n); printf("%d",a[n-1]); for(int i=n-2;i>n-1-m;i--){ printf(" %d",a[i]); } printf("\n"); } return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> int a[1000005]; int main() { int t,n,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(a,0,sizeof(a)); for(int i=0;i<n;i++) { scanf("%d",&t); a[t+500000]=1; } for(int i=1000005;i>0;i--) { if(a[i]==1) { printf("%d",i-500000); m--; if(m>0) { printf(" "); } } if(m==0) break; } printf("\n"); } return 0; }
哈希思想:散列再循环,对每一个数字进行通过改变哈希表的地址散列放置,将散列地址的哈希表记为1,这样 当所有数字录入完毕,只需要扫一遍哈希表,不为0的数字已经按照地址大小排好顺序,大大的减少了时间复杂度。
上面这段代码感觉很巧妙,值得学习。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> int a[1000005]; int qsort(int left,int right) { int i,j,t,temp; if(left>right) return 0; temp=a[left]; i=left; j=right; while(i!=j) { while(a[j]>=temp&&i<j) j--; while(a[i]<=temp&&i<j) i++; if(i<j) { t=a[i]; a[i]=a[j]; a[j]=t; } } a[left]=a[i]; a[i]=temp; qsort(left,i-1); qsort(i+1,right); } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<n;i++) { scanf("%d",&a[i]); } qsort(0,n-1); printf("%d",a[n-1]); for(int i=n-2;i>n-1-m;i--) { printf(" %d",a[i]); } printf("\n"); } return 0; }
附一个讲快排的链接,讲的非常清晰http://developer.51cto.com/art/201403/430986.htm
ps:坐马桶上可能一会儿就学会了,但是我学校没马桶怎么办