打赏

HDU1425经典排序之快排

给你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 }


posted @ 2018-11-16 22:54  Onebelieve  阅读(417)  评论(1编辑  收藏  举报