2013-02-04 35 views
1

在下面的代碼中,sort()函數是如何工作的? 例如,如果我們有一個數組:C++中的sort函數如何工作?

a [5] = {1,2,3,4,5}; 

和我排序它在使用我bool cmp()功能, 降序我想知道:它是如何工作的,哪一個元素是int a並且是int b(中bool cmp()函數中的參數),它何時進行排序,以及bool cmp()何時返回1以及何時返回0?

#include <iostream> 
#include <algorithm> 

using namespace std; 
bool cmp (int a , int b) 
{ 
    return (a > b); 
} 

int main() 
{ 
    int a[100]; 
    int n; 
    cin >> n; 
    for (int i=0 ; i<n ;i++) 
     cin >> a[i]; 

    sort(a,a+n,cmp); 
    cout << endl << endl; 
    for (int i=0 ; i<n ;i++) 
     cout << a[i] << " "; 



    return 0; 
} 
+5

看一個很好的C++參考,例如http://en.cppreference.com/w/cpp/algorithm/sort。 –

+2

如果你想知道它是如何實現的,只需在你包含的頭文件('算法')中查找它。 – us2012

+2

@ us2012這是可怕的建議。 'std :: sort'寫得很快,不可讀。 – Yakk

回答

3

它是如何實現的,取決於標準庫的實現。它保證具有O(Nlog(N))的複雜性。常見的實施方式使用quicksortintrosort

比較函數是一個二進制函數,如果第一個參數是嚴格小於秒,則必須返回true。該實現使用此函數來比較容器的兩個元素,以確定哪些應該先於哪些其他元素 - 因此ab可能是容器中的任何兩個元素。該功能必須對元素進行嚴格的弱排序。那就是:

  • 元素是絕不會比自己
  • 如果x < y少,那麼它是不是y < x
  • 如果x < yy < z,然後x < z

如果你不」的情況下t提供比較功能,使用operator<。等同地,您可以通過std::less作爲比較函數。

+0

真的,真的很挑剔:如果你不提供比較函數,使用'std :: less'。 'std :: less',如果未指定,則使用'operator <',除了指針,它使用一個未指定的操作來完全指令指針(不保證'<'不能保證做到這一點),這在很多現代系統剛剛發生爲'<'。 – Yakk

+1

@Yakk我的標準副本說:「對於所有采用'Compare'的算法,都有一個使用'operator <'代替的版本。」我找不到使用'std :: less'的任何內容。 –

+0

該死的 - 這意味着指針上的'std :: sort'不使用'std :: less'是一個壞主意。 (嗯,不是在實踐中) – Yakk

0

檢查這裏排序方法的參考:http://en.cppreference.com/w/cpp/algorithm/sort

的第一個參數是起始指針。 第二個參數是結束指針。 第三個參數是可選的。這是定義如何排序的比較函數。

+0

不鼓勵鏈接回答。請嘗試將文章的內容放在您的答案中! :P –