1. 程式人生 > >快速排序問題(輸出前m大的數)

快速排序問題(輸出前m大的數)

今天做的第一道題就卡死我了,總是超時,總是出錯! 給你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++提交 

每次提交這個就是錯的

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 1000050
int a[100010];
int m;
int cmp(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
}
int main()
{int n,i;
while(scanf("%d",&n)!=EOF)
{
scanf("%d",&m);
for( i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
qsort(a,n,sizeof(a[0]),cmp);
for(i=0;i<m;++i)
{
printf("%d ",a[i]);
     }
    printf("\n");
}
    return 0;
}

這是網上大神的程式碼,只是qsort函式不同,這個就能編譯通過,真搞不懂!

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 #include<stdio.h> #include<stdlib.h> #include<time.h>
#define N 1000050 int a[N];//當資料過大時要放在函式外面防止棧溢位 int m; void QuickSort(int low,int high){ int k; int i; k=a[low]; int left=low; int right=high; if(left>right) return ; while(left!=right){ while(a[right]<k&&left<right) right--; if(left<right){ a[left]=a[right]; left++; }
while(a[left]>k&&left<right) left++; if(left<right){ a[right]=a[left]; right--; } } a[left]=k; if(m<=left+1) QuickSort(low,left-1); else { QuickSort(low,left-1); QuickSort(left+1,high); } } int main(){ int i; int j; int n; while(scanf("%d%d",&n,&m)!=EOF){ for(i=0;i<n;i++) scanf("%d",&a[i]); QuickSort(0,n-1); for(i=0;i<m;i++){ printf("%d",a[i]); if(i!=m-1) printf(" ");//注意最後沒有空格 } printf("\n");//每組資料輸出一行 } return 0; }