1. 程式人生 > >SDUT3401資料結構實驗之排序四:尋找大富翁

SDUT3401資料結構實驗之排序四:尋找大富翁

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; }