在以下情况下哪种排序算法最好?

时间:2018-05-10 13:25:27

标签: algorithm sorting

所以在讲座中我们已经讨论了选择,插入,冒泡,合并,快速,堆和基数排序。所以现在我应该在以下情况下决定最佳算法,并且应该描述我选择那个的原因。

1)对一组可比元素进行排序:我会说堆/合并排序,因为它们在所有情况下都具有O(n logn)时间复杂度。还是快速排序?

2)对一组32位数的元素进行排序:也许是基数排序,但我不确定。

3)在排列很昂贵并且比较不是的条件下对一组可比元素进行排序:我的猜测是选择排序,因为你确实有很多比较,但只有(n-1)次运动

4)在您知道第一个(n-m)元素已经排序且仅最后m个元素未被排序的条件下对一组可比元素进行排序。是否存在O(m log n)或O(n log m)进程?:我会说因为https://www.toptal.com/developers/sorting-algorithms/而插入排序,但我不知道有关其余的问题。

5)在特定截止日期需要解决方案的条件下对一组可比元素进行排序:因为最快的快速排序是n ^ 2,我会选择合并或堆排序。

6)对一组可比元素进行排序,但过程应该是稳定的:这必须是合并排序,因为所有其他算法都不稳定。

1 个答案:

答案 0 :(得分:0)

嗯,问题很少有问题。

第一:对一组可比对象进行排序:如果我没有错,那么每个对象都具有可比性。可以在没有comapring的情况下对场景字符串进行排序,但这是一种特殊情况。

我会选择随机随机快速排序,以避免最坏的情况。尝试在Mergesort和QuickSort上进行倍增比率测试,您会注意到随着尺寸的增加,mergesort会变慢。但是,可以通过在递归调用中使用insert-sort来改进Mergesort。

2:这与排序字符串相同,这完全取决于您对它们的排序方式?根据第一个数字,最后一位或全部应该排序?所以有很多算法: MSD LSD Quick-3wayString排序

4: 在您知道第一个(n-m)元素已经排序且仅最后m个元素未排序的条件下,对一组可比元素进行排序。是否存在O(m log n)或O(n log m)过程:您是否可以在Merge-sort 所以的基础情况下使用insert-sort,它总是会破坏阵列分成两半(nm)和(m + 1 - n)?因为插入排序会在仅进行 n 比较之后打破它的循环,而另一半将通过 NlogN 中的mergesort进行排序,并且您将获得上限为 NlogN < /强>

5:在特定期限内需要解决方案的条件下对一组可比较元素进行排序,该期限将在未来小于n ^ 2次运行:我也会选择Mergesort但是如果我被允许带来算法的变化,然后我将使用Quick-Sort with random-shuffle,(注意:你仍有机会获得n ^ 2时间复杂度)。

6:是的,如果你必须从这些算法中选择,那么Mergesort是唯一的算法。