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


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

你会使用哪种排序算法?

在一般情况下,哪种排序算法使用最少的比较?

如果您可以预期很多比较元素是相同的,比如80%的比较,那该怎么办呢?这有什么不同吗?


7986
2017-10-26 18:39


起源

你试过谷歌吗? - ewok
可能重复 寻找具有尽可能少的比较操作的排序算法 - Christoph
你接受不使用比较的种类吗?并非所有种类都是比较排序(因此不属于O(nlog(n))限制以进行比较排序) - AlexQueue
可能重复: stackoverflow.com/questions/1935194/... - Anderson Green


答案:


很可能 插入排序


排序是其中一个主题,正如他们所说, 细节决定成败。 通常,次要考虑因素主导性能输入参数。

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

在这种情况下,你想要的是一个最快的合理算法 最好的情况, 这几乎可以肯定 插入排序


4
2017-10-26 18:56



为什么要找到具有最快最佳情况的算法(而不是具有最快平均情况的算法)? - Anderson Green


获胜者是 睡觉排序,没有使用比较。


10
2017-10-26 18:50



我从来没有听说过这个。有趣的想法。 - madth3
通过链接后,我发现算法在字面意义上是困倦的。因为算法必须至少等待时间= maximum_value,而其余的排序算法将完成以前的排序方式。但是当问题完全在于最小化否定时。比较然后这个算法摇滚! :) - Arham
有趣的想法:)虽然它假设将排序键转换为整数很容易。 - pinkfloydhomer
一世 认为 声称“没有比较”太强大而且错误 - 至少必须存在 n 迭代元素时进行比较(假设在编译时数组的长度未知)。也是 sleep(time)机器指令?我相信底层操作系统需要进行一些比较来实现它,虽然我不确定(很高兴澄清它)。 (p.s.不是downvoter,仍然在IMO周围工作) - amit
@amit:当我们谈论排序算法中的比较时,我们通常会讨论元素的比较 值,按此标准,Sleep Sort不使用比较。 (sleep() 只是一个实现细节 - 它可以很容易地实现为硬件定时器中断。)睡眠排序并不是要过于认真 - 它只是一个新奇 - 一个有趣和有趣的“开箱即用”思维的例子。 - Paul R


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

在您的数据统一的情况下,您可以使用桶排序(Θ(n),O(n ^ 2))

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

当然你可以使用Sleep排序,但如果你有很多数据它将无法使用。

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


1
2017-10-26 19:04





希尔排序 使用较少的比较。

你有很多相同的元素, 数排序  应该做的工作


0
2017-10-26 18:46





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

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

0
2017-10-26 18:44