SDUT3401資料結構實驗之排序四:尋找大富翁
阿新 • • 發佈:2018-12-20
c中的快排
此題出題者本意應該是讓我們用堆排序去做,但是鄙人只知何為堆,不知如何做,故投機取巧,用了c語言中的快排qsort();
這個快排在stdlib標頭檔案下
格式為
qsort(陣列的起始地址即陣列名,元素的個數,每個元素的大小(位元組數),自定義函式(指向函式的方向指標,用於排序和決定怎麼排))
*> compar引數指向一個比較兩個元素的函式。比較函式的原型應該像下面這樣。注意兩個形參必須是const void *型,同時在呼叫compar 函式(compar實質為函式指標,這裡稱它所指向的函式也為compar)時,傳入的實參也必須轉換成const void *型。在compar函式內部會將const void 型轉換成實際型別,見下文。
int compar(const void *p1, const void *p2);
如果compar返回值小於0(< 0),那麼p1所指向元素會被排在p2所指向元素的前面
如果compar返回值等於0(= 0),那麼p1所指向元素與p2所指向元素的順序不確定
如果compar返回值大於0(> 0),那麼p1所指向元素會被排在p2所指向元素的後面
因此,如果想讓qsort()進行從小到大(升序)排序,那麼一個通用的compar函式可以寫成這樣:
此處借鑑了一位大哥的部落格,特此發出連結,以表敬意:詳細的qsort講解
再就是此題亦限時,需加一句 ios::sync_with_stdio(false); 以防超時。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
int a[1000010];
int cmp(const void *a,const void *b){
return *(int *)b - *(int *)a;
}
int main()
{
ios::sync_with_stdio(false);
int n,m,x;
while(cin>>n>> m){
int j = 0;
for(int i=0; i<n; i++){
cin>>x;
if(j<m)
a[j++] = x;
else{
int d = 0;
for(int l=1; l<m; l++){
if(a[d]>a[l])
d = l;
}
if(a[d]<x)
a[d] = x;
}
}
qsort(a,m,sizeof(a[0]),cmp);
for(int i=0; i<m; i++){
if(i==m-1)
cout<<a[i]<<endl;
else
cout<<a[i]<<" ";
}
}
return 0;
}