最近學弟們問快速排序的比較多,今天自己就做一下總結,快速排序在庫函數里面有現成的,不用自己實現,調用一下就可以達到自己想要的結果,掌握以后就可以完全摒棄冒泡和選擇了,並且時間復雜度也從O(n*n)提升到O(n*log(n)),
先說C中的qsort():
頭文件:#include<stdlib.h>,
調用參數:qsort(排序首地址,需排序元素個數,需排序元素大小,定義排序方式的函數名);
1,對int型數組a[n]排序:
int cmp (const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}//升序
int cmp (const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}//降序
2,對字符串數組a[n]排序:
int cmp (const void *a, const void *b)
{
return strcmp((char *)a, (char *)b);
}//升序
int cmp (const void *a, const void *b)
{
return strcmp((char *)b, (char *)a);
}//降序
3,對結構體數組a[n]排序
struct node
{
int x, y;
};
int cmp (const void *a, const void *b)
{
node *c = (node *)a;
node *d = (node *)b;
return c->x - d->x;
}//按照a[i].x升序排列
int cmp (const void *a, const void *b)
{
node *c = (node *)a;
node *d = (node *)b;
return d->x - c->x;
}//按照a[i].x降序排列
ps:結構體的二級排序只需要再加上一個if條件語句即可。
以上所有的排序函數,使用時都是調用qsort(a, n, sizeof(a[0]), cmp);
C++中的sort函數:其實有時候sort函數比qsort函數還要稍微快那么一點,並且用起來比較方便,所以在這里做一下廣告,有排序用sort函數,不能用創造機會也要用!!!
頭文件:#include<algothrim>
調用參數:sort(排序首地址,排序末地址,定義排序方式的函數名(可有可無)),如果沒有排序方式默認按照升序排列。
現在我們就解決一下如何按照降序方式排列。
1,對int型數組a[n]降序排:
bool cmp (int a, int b)
{
return a > b;
}//降序
2,對string型的數組a[n]排序:
bool cmp (string a, string b)
{
return a > b;
}//降序
3,對結構體型的數組a[n]排序:
bool cmp (node a, node b)
{
return a.x > b.x;
}//降序
ps:如果對結構體進行二級排序,只需在排序函數里面加上if語句。
以上所有的排序函數調用的時候都是用:sort(a, a+n, cmp);
其實強大的stl庫給我們提供了辣么多的函數,有一些在這里還是很有用的,比如:
sort(a, a+n, less<數據類型>());//對指定的數據類型升序排
sort(a, a+n, greater<數據類型>());//對指定的數據類型降序排
因為C/C++給我們提供給了太多的數據類型,所以上面只是一些常見的數據類型的排序。