2013-02-04 34 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 –