C 中的 sort函式 函式指標 仿函式

2021-10-03 19:35:07 字數 2204 閱讀 4415

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...