1. 程式人生 > >ACM排序演算法sort()與qsort()用法

ACM排序演算法sort()與qsort()用法

這個禮拜講的是排序,學長給講了講qsort的用法,在排序中首先考慮的就是qsort,所以百度總結了一下,給大家分享下。
1、sort()和qsort()比較,哪個效率高?
sort函式的效率更高吧。
qsort(陣列名,陣列長度,陣列中每個元素大小,compare);     compare函式的寫法決定了排序是升序還是降序。需要#include<stdlib.h>
例如:
int compare(const void*a,const void*b){return *(*int)a-*(int*)b;}  
示例:qsort(a,10,sizeof(int),compare)    //假設已定義了整型陣列a[10]
升序排序的寫法,如果是:return *(*int)b-*(int*)a   就是降序,不論是什麼型別的陣列,該函式的形式都是這樣的
sort(陣列名,陣列末地址,compare)    //若不寫compare則預設升序排列,需要#include<algorithm>
例如:
sort(a,a+10);        //將陣列a以升序排序,假設先前定義了a[10]並輸入了資料
其實升序還是降序沒有多大關係,無所謂了,在輸出語句做很小的改動就ok了!
2、對一維整數型陣列排序情況:

1、qsort
是C的排序函式,其標頭檔案是#include<stdlib>.

自定義函式cmp僅針對一維整數型陣列,定義如下:

int cmp(const void *a,const void *b)
{
return (*(int*)a-*(int*)b);
}
對應qsort:
qsort(p,num,sizeof(p[0]),cmp);

2.sort
是C++的排序函式,其標頭檔案是#include<algorithm>
自定義函式cmp僅針對一維整數型陣列,定義如下:
bool cmp(int a,int b)
{
return a<b;
}

//注意兩者的返回值型別!!!
對應sort:
sort(p,p+num,cmp);
主要部分就是這些,算了,把雞肋也給出來好了.. ..
int main()
{
int num;
cout<<"Please input the size of your array.."<<endl;
cin>>num;
int *p =new int[num];
for(int i = 0;i != num;i++)
cin>>p;
// qsort(p,num,sizeof(p[0]),cmp);

sort(p,p+num,cmp);
for(int j = 0;j != num;j++)
cout<<p[j]<<' ';
cout<<endl;
delete p;
return 0;
}


轉帖部分:
關於快排的一些小問題
1.快排的複雜度,當元素個數比較少時(10^2的數量級左右),快排的速度跟冒泡相比並沒有快很多,還有如果要排序的元素大部分都已經是排好順序了時,快排效率會下降,但是其最壞情況是N^2(當元素全部是已經排好的順序時),一般情況(也即平均效率)是N*Log2(N),最好情況是N(當元素全部是逆序時),快排的特點是元素越亂排序速度越快,所以可以看出,雖然元素少時使用快排並沒有很大優勢,但是在快排的最壞情況跟冒泡、選擇排序(冒泡、選擇排序其複雜度不受元素順序影響,永遠為N^2)一樣,所以快排永遠是最快的。
2.快排是不穩定的,這裡的穩定性是指對於相同元素的處理上,快排會打亂相同元素的先後順序(原因就在於快排排序原理,其排序過程是不斷把元素分組打亂進行的),當然如果單純排序一列數字是沒什麼區別的,假設我們有這樣一列數字3,3,3,但是三個3是有區別的,我們標記為3a,3b,3c,快排後的結果不一定就是3a,3b,3c這樣的排列,所以在某些特定場合我們要用結構體來使其穩定(No.5的例子就是說明這個問題的)