给你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
这道题的就是快排,因为这道题会卡时间的
快排的原理就是先选定一个中间值,然后在左边找一个大的,再在左边找一个小的,然后交换他们的位置,交换完之后就进行递归,这样就可以保证数据有序了
话不多说,下面就放代码吧
1 #include<stdio.h> 2 #include<string.h> 3 int d[1000010]; 4 #define rep(i,a,b) for(int i=a;i<b;i++) //宏定义的骚操作,rep可以自己定义 5 void qsort(int array[], int l, int r) //形参为要排序的数据和最小最大的下标 6 { 7 int i = l, j = r; 8 int t, p; 9 10 p = array[(l + r) / 2]; //取下标的中间值 11 12 while(i <= j) 13 { 14 while(array[i] > p) 15 { 16 i++; 17 } //在左边找一个比p小的 18 while(array[j] < p) 19 { 20 j--; 21 } //在右边找一个比p大的 22 if(i <= j) 23 { 24 t = array[i]; 25 array[i] = array[j]; 26 array[j] = t; 27 i++; 28 j--; 29 } // 交换值 30 } 31 if(l < j) 32 { 33 qsort(array, l, j); //将左边的递归排列 34 } 35 if(i < r) 36 { 37 qsort(array, i, r); //将右边的递归排列 38 } 39 } 40 int main() 41 { 42 int n,m; 43 while(~scanf("%d%d",&n,&m)) 44 { 45 46 rep(i,0,n) 47 { 48 scanf("%d",&d[i]); 49 } 50 qsort(d,0,n-1); 51 rep(i,0,m-1) 52 { 53 printf("%d ",d[i]); 54 } 55 printf("%d\n",d[m-1]); 56 } 57 return 0; 58 }