想象一下两个元素的比较非常昂贵的情况。
您会使用哪种排序算法?
哪种排序算法在平均情况下使用最少的比较?
如果你可以预期很多比较的元素是相同的,比如80%的比较,那该怎么办?它有所作为吗?
答案 0 :(得分:9)
获胜者是Sleep Sort,没有使用比较。
答案 1 :(得分:3)
排序是其中一个主题,正如他们所说,魔鬼在细节中。通常,次要考虑因素在性能输入参数中占主导地位。
但是,如果比较非常昂贵,并且大多数密钥相同,则可能会认为输入已经排序或已经几乎排序。
在这种情况下,你想要的是一个合理的算法,它具有最快的最佳情况,,几乎可以肯定是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