【问题标题】:C: Sorting Methods AnalysisC:排序方法分析
【发布时间】:2010-11-23 06:01:29
【问题描述】:

我有很多不同的排序算法,它们都有以下签名:

void <METHOD>_sort_ints(int * array, const unsigned int ARRAY_LENGTH);

是否有任何可用于进行经验比较的排序测试套件?

【问题讨论】:

  • 将值类型参数作为 const 传递是没有意义的。我想这也没有什么坏处,但它......毫无意义而且冗长。
  • 如果排序算法是正确实现的标准算法,那么已经有复杂度分析数据可用(google it),做排序分析的目的是什么?
  • @unwind:我更喜欢将常量值声明为常量值。 @learner:a)许多不是标准的。 b)由于内存和缓存,我的算法在每台机器上执行不同,不幸的是,在这些情况下不能接受泛化。
  • 听起来像是几年前我必须为数据结构课程做的一个项目 :) 之后,它是插入、删除和迭代各种容器结构并进行比较。

标签: c sorting analysis


【解决方案1】:

This detailed discussion,以及链接到您可能会发现有用的大量相关网页,还描述了一组用于测试排序算法的有用输入数据(请参阅链接页面了解原因)。总结:

  1. 完全随机改组的数组
  2. 已排序的数组
  3. 已经按逆序排列了数组
  4. 电锯阵列
  5. 相同元素的数组
  6. 具有 N 个排列的已排序数组(N 为大小的 0.1% 到 10%)
  7. 已经按 N 个排列倒序排列的数组
  8. 具有重复(或关闭)键的正态分布数据(仅用于稳定排序)
  9. 伪随机数据(S&P500 或其他十年指数的每日值在这里可能是一个很好的测试集;它们可从 Yahoo.com 获得)

【讨论】:

    【解决方案2】:

    排序的权威研究是Bob Sedgewick的博士论文。但是在他的算法教科书中有很多很好的信息,而这些是我寻找测试套件和方法的前两个地方。如果你最近上过一门课程,你会比我知道的更多;上次我有一个课程,最好的方法是使用快速排序到大小为 12 的分区,然后对整个数组运行插入排序。但答案的变化与硬件一样快。

    Jon Bentley 的 Programming Perls 书籍有一些其他关于排序的信息。

    您可以快速创建一个包含

    的测试套件
    • 随机整数

    • 排序的整数

    • 倒序整数

    • 有序整数,轻微扰动

    如果没有记忆,这些是排序算法最重要的情况。

    如果您要对不适合缓存的数组进行排序,则需要测量缓存效果。 valgrind 慢时有效。

    【讨论】:

      【解决方案3】:

      sortperf.py 有一套精心挑选的基准测试用例,用于支持发现 here 的文章,并在多年前使用 Python 进行排序。请注意,由于 Josh Block(请参阅here),Java 可能最终也将迁移到 timsort,所以我想他们已经编写了自己的基准测试用例版本——但是,我不能轻易找到对它的引用。 (timsort,一种稳定的、自适应的、迭代的自然归并排序变体,特别适用于具有引用对象语义的语言,如 Python 和 Java,其中“数据移动”相对便宜 [[因为所有被移动的都是引用,也就是指针,而不是无限大小的 blob;-)]],但是比较可能相对昂贵 [[因为比较函数的复杂性没有上限——但这适用于任何可以通过自定义自定义排序的语言比较或密钥提取功能]])。

      【讨论】:

        【解决方案4】:

        本网站使用四组展示了各种排序算法: http://www.sorting-algorithms.com/

        除了 Norman 回答中的四组之外,您还想检查排序算法,其中包含在数字中有一些相似之处的数字集合:

        • 所有整数都是唯一的
        • 整个集合中的相同整数
        • 很少有唯一键

        更改集合中元素的数量也是一个很好的做法,用 1K、1M、1G 等检查每个算法,看看该算法对内存的影响是什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-23
          • 1970-01-01
          • 1970-01-01
          • 2018-02-08
          • 1970-01-01
          • 1970-01-01
          • 2011-07-04
          相关资源
          最近更新 更多