哪种排序算法使用最少的比较?

时间:2012-10-26 18:39:19

标签: algorithm sorting

想象一下两个元素的比较非常昂贵的情况。

您会使用哪种排序算法?

哪种排序算法在平均情况下使用最少的比较?

如果你可以预期很多比较的元素是相同的,比如80%的比较,那该怎么办?它有所作为吗?

7 个答案:

答案 0 :(得分:9)

获胜者是Sleep Sort,没有使用比较。

答案 1 :(得分:3)

很可能Insertion Sort


排序是其中一个主题,正如他们所说,魔鬼在细节中。通常,次要考虑因素在性能输入参数中占主导地位。

但是,如果比较非常昂贵,并且大多数密钥相同,则可能会认为输入已经排序或已经几乎排序。

在这种情况下,你想要的是一个合理的算法,它具有最快的最佳情况,,几乎可以肯定是an insertion sort.

答案 2 :(得分:1)

这取决于您拥有的数据。你需要稳定的算法吗?

你的数据是统一的,你可以使用桶排序(Θ(n),O(n ^ 2))

counting sort(我认为这是你正在寻找的),它也是稳定的算法,但需要更多的内存(少了你有很多相同的记录)。

当然你可以使用Sleep排序,但是如果你有很多数据它就不会有效。

如果你的元素在80%相同,也许有一个简单的方法可以说有相同的(只是相同的)?

答案 3 :(得分:1)

Merge-insertion sort 是一种插入排序的变体,被誉为是几十年来已知比较最少的排序算法,并且也许仍然是最好的免费文档排序算法(最小比较:

  

合并插入排序是一种排序算法,当 n ≤15或20≤ n ≤22时,对 n 个项目的比较可能最少,并且已知的 n ≤46的比较最少。

Glenn K. Manacher's algorithm“以及后来的打破记录的排序算法”(不幸的是,这一次似乎没有免费记录)据报道适用于合并插入排序算法以提供更少的比较。 / p>

答案 4 :(得分:0)

Shellsort使用较少的比较。

你有很多相同的元素,Counting sort 应该做的工作

答案 5 :(得分:0)

也许是非比较算法,例如基数排序可能是答案,因为在一般情况下它也很快(花费时间O(n))。元素之间也没有进行比较,但另一方面,它需要大量内存

答案 6 :(得分:-1)

分发排序(使用散列数组)几乎不进行比较。

m = max number  may appear in the input + 1
hash = array of size m
initialize hash by zeroes

for i = 0 to n - 1
    hash[input[i]] = hash[input[i]] + 1
j = 0
for i = 0 to m - 1
    while hash[i] > 0
        sorted[j] = i
        j = j + 1
        hash[i] = hash[i] - 1