【问题标题】:how does sort function in c++ work? [closed]c++中的排序函数是如何工作的? [关闭]
【发布时间】:2013-01-19 07:10:04
【问题描述】:

在下面的代码中,sort() 函数是如何工作的? 例如,如果我们有一个数组:

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

然后我使用我的bool cmp() 函数按降序对其进行排序, 我想知道:它是如何工作的,哪个元素是int a,哪个是int bbool 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;
}

【问题讨论】:

  • 查看一个好的 C++ 参考,例如en.cppreference.com/w/cpp/algorithm/sort.
  • 如果你想知道它是如何实现的,只需在你包含的头文件中查找它(algorithm)。
  • @us2012 这是一个可怕的建议。 std::sort 写得很快,不可读。
  • @Yakk 我不敢苟同。对于它如何工作的一般概述,Oli 发布了一个链接来解释这一点。正如我的评论所说,如果您想知道它是如何实现的,您必须阅读实现。

标签: c++ sorting


【解决方案1】:

如何实现取决于标准库的实现。保证具有O(Nlog(N)) 复杂性。常见实现使用quicksortintrosort

比较函数是一个二进制函数,如果第一个参数严格小于第二个,则必须返回true。该实现使用此函数来比较容器的两个元素,以确定哪个应该先于其他元素 - 所以 ab 可以是容器中的任意两个元素。此函数必须对元素进行严格的弱排序。那就是:

  • 元素永远不会小于它自己
  • 如果x &lt; y,则不是y &lt; x
  • 如果x &lt; yy &lt; z,那么x &lt; z

如果您不提供比较函数,则使用operator&lt;。等效地,您可以传递std::less 作为比较函数。

【讨论】:

  • 真的,真的很挑剔:如果您不提供比较功能,则使用std::lessstd::less,如果未专门化,则使用 operator&lt;,除了在指针上,它使用完全排序指针的未指定操作(&lt; 不能保证这样做),这在许多现代系统上恰好是 @987654338 @.
  • @Yakk 我的标准副本说“对于所有采用Compare 的算法,都有一个版本使用operator&lt;。”我使用std::less 找不到任何关于它的信息。
  • 该死——这意味着在指针上使用std::sort 而不使用std::less 是个坏主意。 (嗯,不是在实践中)
【解决方案2】:

在这里查看排序方法的参考:http://en.cppreference.com/w/cpp/algorithm/sort

第一个参数是起始指针。 第二个参数是结束指针。 第三个参数是可选的。它是定义如何排序的比较函数。

【讨论】:

  • 不鼓励仅链接的答案。请尽量把文章的内容放在你的回答中! :P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多