【问题标题】:Determine sorting algorithm from results根据结果​​确定排序算法
【发布时间】:2015-06-12 16:52:41
【问题描述】:

我现在正在修改排序算法。问题来了:

假设这个排序算法是用C写的,把'a'和'A'当作相等,运行这个排序算法后,结果如下:

10000 个随机数据 -> 0.016 秒
100000 个随机数据 -> 0.304 秒

10000 个有序数据 -> 0.006 秒
100000 个有序数据 -> 0.108 秒

10000 个反转数据 -> 0.010 秒
100000 个反转数据 -> 0.138 秒

问题:用点的形式简要说明您可以从上面的测试结果中得出的结论。

我做了什么
我知道这种排序算法是不稳定的(如问题中所述),我猜它是一种快速排序。 我知道快速排序有最坏情况 O(n^2)、平均和最佳情况 O(n log n),但我不知道如何解释结果,我不能只说哦,因为它的不稳定和快速排序在倒序时有不好的结果,所以我可以确定它是快速排序。

我可以从结果中看出什么具体的东西吗?如果结果中有数学计算或其他一些重要的观察结果,那就太好了。

【问题讨论】:

  • “我知道这个排序算法是不稳定的(如问题中所述)”-问题在哪里表明它不稳定?
  • @user2357112 它说它对待'a'和'A'是一样的,所以我认为它不稳定
  • 不稳定意味着您正在替换相等的值。稳定的排序算法不会这样做
  • 你误解了稳定性的概念。某种稳定性与它认为相等的项目无关。相反,稳定的排序将在输出中保持相等的元素在输出中的相对顺序,就像它们在输入中出现一样。
  • @GiorgiNakeuri 那么,这稳定吗?

标签: algorithm sorting


【解决方案1】:

我们可以看出这不是像选择排序或插入排序那样的二次时间算法,因为将输入大小提高 10 倍会使运行时间提高 13-19 倍。这是我们对 O(n*log(n)) 平均情况算法的预期行为,例如合并排序或良好的快速排序。

我们可以看出该算法不是自适应的,或者至少不是很自适应。自适应算法在排序后的输入上会表现得更好,也可能在反向输入上表现得更好。特别是,将排序输入的大小提高 10 倍会使运行时间提高约 10 倍。虽然该算法在排序或反向排序输入上的表现优于随机输入,但这看起来更像是一个结果例如,在这些情况下更有效的分支预测。

我们没有任何信息表明排序是否稳定。

我看不出有什么可以区分这是快速排序、合并排序、堆排序还是其他O(n*log(n)) 算法。我们可以为快速排序排除某些类型的枢轴选择 - 例如,始终选择第一个元素作为枢轴的快速排序将在已排序的输入上以二次时间运行 - 但除此之外,我无法确定。

【讨论】:

    猜你喜欢
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多