hdu 1425:sort(排序,经典题。快排模板)

sort

Time Limit : 6000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 3   Accepted Submission(s) : 2

Font: Times New Roman | Verdana | Georgia

Font Size:  

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

Hint

Hint
请用VC/VC++提交

Author

LL

Source

ACM暑期集训队练习赛(三)
 
  排序算法,综合练习。
  这道题可以作为排序算法的综合练习,题意很简单,没有那么多弯弯绕绕,对n个数进行排序,然后输出前m个大的数。数据规模很大,冒泡会超时。有疑惑的话可以用下方冒泡排序代码测试一下。
 1 #include <iostream>

 2 #include <stdio.h>

 3 using namespace std;

 4 int a[1000001];

 5 int main()

 6 {

 7     int n,m;

 8     while(cin>>n>>m){

 9         int i,j;

10         for(i=1;i<=n;i++)

11             scanf("%d",&a[i]);

12         for(i=1;i<=n-1;i++)

13             for(j=1;j<=n-i;j++)

14                 if(a[j]>a[j+1]){

15                     int t;

16                     t=a[j];a[j]=a[j+1];a[j+1]=t;

17                 }

18         for(i=n;i>=n-m+1;i--){

19             if(i==n-m+1)

20                 cout<<a[i]<<endl;

21             else

22                 cout<<a[i]<<' ';

23         }

24     }

25     return 0;

26 }
View Code

  惭愧的是,为了省事,这道题我直接套用了<algorithm>中的sort()函数,从网上得知该函数使用的是内省排序,时间复杂度是O(nlogn),应付这道题是够了,时间用了500+MS。当然你也可以采用快排,时间复杂度也是O(nlogn),对付这道题也没问题。

  注意:输出前m个数的时候,最后一个数后面不能带空格' ',否则提交会格式错误。

  有时间会重新用这道题练习一下,低效率的算法通过不了这道题。

 

 1 #include <iostream>

 2 #include <stdio.h>

 3 #include <algorithm>

 4 using namespace std;  5 int a[1000001];  6 int main()  7 {  8     int n,m;  9     while(cin>>n>>m){ 10         int i; 11         for(i=1;i<=n;i++)    //输入

12             scanf("%d",&a[i]); 13         sort(a+1,a+n+1);    //从小到大排序

14         for(i=n;i>=n-m+1;i--){    //输出前m个大的数

15             if(i==n-m+1) 16                 cout<<a[i]<<endl; 17             else

18                 cout<<a[i]<<' '; 19  } 20  } 21     return 0; 22 }

 

Run ID Submit Time Judge Status Pro.ID Exe.Time Exe.Memory Code Len. Language Author
10133960 2014-02-20 15:49:42 Accepted 1425 593MS 2284K 343 B C++ freecode

 

 


 

  正好看到数据结构内排序这一部分,想起了这道题,拿它来练习快速排序正好。

  注意:输入的时候尽量用scanf(),用cin会超时。

  快排模板

 1 void quicksort(int a[],int s,int t)    //对a[]的第s个到第t个元素进行从小到大的排序

 2 {  3     int i=s,j=t;  4     int tmp = a[s];  5     if(s<t){    //区间内元素剩0个或者1个的时候停止

 6         while(i<j){  7             while(i<j && a[j]>=tmp)  8                 j--;  9             a[i] = a[j]; 10             while(i<j && a[i]<=tmp) 11                 i++; 12             a[j] = a[i]; 13  } 14         a[i] = tmp; 15         quicksort(a,s,i-1);    //对左区间递归排序 

16         quicksort(a,i+1,t);    //对右区间递归排序 

17  } 18 }

  本题代码

 1 #include <iostream>

 2 #include <stdio.h>

 3 using namespace std;  4 int a[1000001];  5 void quicksort(int a[],int s,int t)  6 {  7     int i=s,j=t;  8     int tmp = a[s];  9     if(s<t){    //区间内元素剩0个或者1个的时候停止

10         while(i<j){ 11             while(i<j && a[j]>=tmp) 12                 j--; 13             a[i] = a[j]; 14             while(i<j && a[i]<=tmp) 15                 i++; 16             a[j] = a[i]; 17  } 18         a[i] = tmp; 19         quicksort(a,s,i-1);    //对左区间递归排序 

20         quicksort(a,i+1,t);    //对右区间递归排序 

21  } 22 } 23 int main() 24 { 25     int i; 26     int n,m; 27     while(cin>>n>>m){ 28         for(i=1;i<=n;i++) 29             scanf("%d",&a[i]); 30         quicksort(a,1,n); 31         for(i=n;i>=n-m+1;i--){ 32             printf("%d",a[i]); 33             if(i!=n-m+1) 34                 printf(" "); 35             else 

36                 printf("\n"); 37  } 38  } 39     return 0; 40 }

 

Run ID Submit Time Judge Status Pro.ID Exe.Time Exe.Memory Code Len. Language Author
10361233 2014-03-21 19:40:50 Accepted 1425 468MS 2276K 693 B C++ freecode

 

Freecode : www.cnblogs.com/yym2013

你可能感兴趣的:(sort)