排序算法中不同列表的比较次数

时间:2016-02-16 06:15:22

标签: algorithm sorting comparison

我一直在研究排序算法,并对每种排序算法中的比较次数有疑问。

假设我们有一个排序算法(插入排序,快速排序,任何东西)。然后我想计算使用不同文件的比较次数。这些文件具有随机化但不按顺序排列的项目。例如,文件1有10个项目,包含字母a到j。然后我们有另一个文件(同样,10项)包含整数1到10.然后我们有另一个文件(10项),包含浮点数1.1111111111到10.1111111111。如果我们想使用任何排序算法对它们进行排序(对于第一个,我们按字母顺序排序,其他排序从最小到最大)。

如果我们计算每个文件中的比较次数(例如,在快速排序算法中),它们是否相同,因为我们正在比较相同数量的项目,或者项目的长度是否会改变比较的数量(a vs 10.1111111)?如果它们是相同的,那么所有排序算法(至少是我提到的算法)还是仅仅是一些?我不认为这是一个很难的问题(对不起),但我像往常一样过度思考。我猜他们会是一样的,但我不是真的。有人会关心解释吗?

2 个答案:

答案 0 :(得分:1)

您正在考虑输入文件中的算法性能。为了规范这类问题,科学家已经为每种算法提供了三种的性能:

  1. 最佳案例 - 费用下限
  2. 最差情况 - 成本上限
  3. 平均情况 - “预期费用”
  4. 现在,如果您想获得特定输入的比较次数,那么您可以形成自己的数学模型。但是对于标准化,您可以考虑这三种类型。另外一点是,比较次数不随输入类型而变化,而是数据的顺序。这意味着如果将排序的输入传递给插入排序,它将为您提供O(N)大约N次比较。但如果它是反向形式,那么它是最糟糕的情况。

    这是分类的分析: Sorting Comparision

    参考:Princeton course

答案 1 :(得分:1)

比较次数取决于初始状态。排序算法具体实现。

例如:

  • 实现可以进行第一次检查以检查该集合是否已经按顺序排序或下调,以避免不必要的工作甚至是最坏的情况。这样做成本很低,但可以避免病情。对于执行该实现的实现与不实现的实现之间的相同集合,比较的数量将大不相同。

  • 某些实施选择,例如在qsort()中选择作为枢轴的元素,将极大地影响相同集合的比较次数。

  • 更糟糕的是:为了避免qsort()中的二次最坏情况,如Kernighan的论文anti qsort中所述,可以更容易触发,可以实现qsort()使用一些随机源来对枢轴值进行非确定性选择。对于这样的实现,即使对于重复地对同一组进行排序,比较的数量也可以变化。请注意,由于qsort()不稳定,如果某些元素相等,则会产生不同的顺序。

除非您了解初始状态和排序算法的具体实现,否则无法准确回答您老师的问题。即使是最佳案例和最差案例数也取决于实施细节。