快速排序問題(輸出前m大的數)
阿新 • • 發佈:2019-01-28
今天做的第一道題就卡死我了,總是超時,總是出錯!
給你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;
}
|