ACM排序演算法sort()與qsort()用法
阿新 • • 發佈:2019-02-04
這個禮拜講的是排序,學長給講了講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>.
2.sort
是C++的排序函式,其標頭檔案是#include<algorithm>
自定義函式cmp僅針對一維整數型陣列,定義如下:
//注意兩者的返回值型別!!!
對應sort:
轉帖部分:
關於快排的一些小問題
1.快排的複雜度,當元素個數比較少時(10^2的數量級左右),快排的速度跟冒泡相比並沒有快很多,還有如果要排序的元素大部分都已經是排好順序了時,快排效率會下降,但是其最壞情況是N^2(當元素全部是已經排好的順序時),一般情況(也即平均效率)是N*Log2(N),最好情況是N(當元素全部是逆序時),快排的特點是元素越亂排序速度越快,所以可以看出,雖然元素少時使用快排並沒有很大優勢,但是在快排的最壞情況跟冒泡、選擇排序(冒泡、選擇排序其複雜度不受元素順序影響,永遠為N^2)一樣,所以快排永遠是最快的。
2.快排是不穩定的,這裡的穩定性是指對於相同元素的處理上,快排會打亂相同元素的先後順序(原因就在於快排排序原理,其排序過程是不斷把元素分組打亂進行的),當然如果單純排序一列數字是沒什麼區別的,假設我們有這樣一列數字3,3,3,但是三個3是有區別的,我們標記為3a,3b,3c,快排後的結果不一定就是3a,3b,3c這樣的排列,所以在某些特定場合我們要用結構體來使其穩定(No.5的例子就是說明這個問題的)
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的例子就是說明這個問題的)