sort函式有2種常見的寫法,一種是不帶參的,也就是預設的公升序,一種是傳入函式指標的,用函式自定義排序規則。
示例:
#include#include#includeusing namespace std;
class cmp
};bool cmp2(int a, int b) //從大到小
int main()
; sort(num, num + 4);
cout << num[0] << num[1] << num[2] << num[3] << endl;
sort(num, num + 4, cmp2);
cout << num[0] << num[1] << num[2] << num[3] << endl;
sort(num, num + 4, cmp());
cout << num[0] << num[1] << num[2] << num[3] << endl;
sort(num, num + 4, greater<>());
cout << num[0] << num[1] << num[2] << num[3] << endl;
sort(num, num + 4, less<>());
cout << num[0] << num[1] << num[2] << num[3] << endl;
return 0;
}
輸出:
1234
4321
1234
4321
1234
其中,sort(num, num + 4);是預設的公升序排序,
sort(num, num + 4, cmp2); 是傳入cmp2這個函式指標,
而sort(num, num + 4, c); 是傳入乙個物件,物件中包含乙個仿函式。
greater<>() 和 less<>() 都是標頭檔案中的函式。
仿函式,就是在類中過載()運算子,使得乙個類表現得像乙個函式。
c++中的sort函式由於用了模板程式設計,使得用處非常廣泛,而且時間複雜度是o(n log n),效率也很高。
附上c++中sort的實現**:
templateinline
void sort(_ranit _first, _ranit _last, _pr _pred)
// template function sort
templateinline
void sort(_ranit _first, _ranit _last)
可以看出,預設的比較函式就是less<>()
再附上其中_sort函式的**:
templateinline
void _sort(_ranit _first, _ranit _last, _diff _ideal, _pr _pred)
else
}if (_isort_max < _count)
else if (1 < _count)
_insertion_sort(_first, _last, _pred); // small
}
可以看出是快速排序、堆排序、插入排序三者的結合。
快速排序的優點是平均時間比堆排序快,但時間複雜度是o(n^2),而堆排序的時間複雜度是o(n log n)
這裡的sort函式,平均排序時間非常快,而且時間複雜度是o(n log n)
3個排序的結合方法:
(1)深度太深時使用堆排序
_ideal /= 2, _ideal += _ideal / 2; // allow 1.5 log2(n) divisions
這個注釋不對,實際上應該是log(n)/log(4/3)次劃分,大概等於2.4 log2(n)
_ideal 這個量沒有具體的含義,它既是一開始等於n,然後每次乘以3/4,當它變為0時我就當做深度太深,剩下的交給堆排序
(2)元素太少時使用插入排序
這裡的常量_isort_max = 32,即當遞迴到只有32個元素時,對這個小片段採取插入排序。
片段花費時間32*31
如果n個元素分割成n/32個片段,每個片段都是32個元素,都採取插入排序,那麼總時間是:
n/32 * 32*31 + n* log2(n/32) = n* (log2(n) +26)
這個結果可以認為就是n* log2(n)
仿函式 C 中仿函式的應用
仿函式 c 中仿函式的應用 在使用仿函式的時候,主要用到以下兩種 一種是以基類std unary function派生出來的派生類 另一種是以基類std binary function派生出來的派生類。而這兩種有什麼區別呢?它們之間的區別只是第一種接收的引數個數為乙個,而第二種接收的引數的個數為兩個...
c 中的sort 函式
起來自己天天排序排序,冒泡啊,二分查詢啊,結果在stl中就自帶了排序函式sort,qsort,總算把自己解脫了 所以自己總結了一下,首先看sort函式見下表 函式名 功能描述 sort 對給定區間所有元素進行排序 stable sort 對給定區間所有元素進行穩定排序 partial sort 對給...
C 中的sort函式
一 為什麼要用c 標準庫里的排序函式 sort 函式是 c 一種排序方法之一,學會了這種方法也打消我學習 c 以來使用的氣泡排序和選擇排序所帶來的執行效率不高的問題!因為它使用的排序方法是類似於快排的方法,時間複雜度為n log2 n 執行效率較高!二 c 標準庫里的排序函式的使用方法 i sort...