答案 0 :(得分:21)
以下site对常见排序算法进行了比较 - 当集合接近排序时,似乎插入排序获胜。
答案 1 :(得分:6)
但严重的是:Bubblesort很接近,但并不完全。 Bubblesort反复向一个方向移动,因此如果阵列顶端附近有一个低调值,并且比较站点始终向上“冒泡”,则需要对主循环进行多次迭代才能使数据项向下冒泡与当前相反。这是最糟糕的情况,对Bubblesort来说是灾难性的。
但是对BubbleSort进行了改进,有时称为 Elevator Cocktail Sort,其中气泡在交替的方向上移动:一次向上,一次向下,重复。这允许单个元素在单次通过中移动长距离(或实际上,2次通过),并且通过次数与需要移动的元素的数量成比例。对于少量未分类的元素,这可以提高效率。
我相信,对于一般情况,marek答案中的第二个链接会更快。 Bubble / Elevator 鸡尾酒排序的优点在于它非常简单,几乎万无一失,而且工作量很大。
答案 2 :(得分:3)
如果它已经被订购到如此高的程度,并且未完全排序的元素离它们的正确位置不远,那么这可能是bubblesort有用的少数情况之一。
答案 3 :(得分:2)
Google为此提供lot of results,例如本文概述了如何实现这一目标的各种方法:http://home.tiac.net/~cri/2004/ksort.html
答案 4 :(得分:1)
将它们放入数组中。你不想搞乱一个40k的链表。
CocktailSort的情况非常狭窄(两个方向的气泡)。但这取决于1%未分类的含义。如果有少数元素被取代,但接近目标位置则可能有效。
但InsertionSort或ShellSort几乎总会赢。即使在CocktailSort理论上会更好的情况下,差异也会很小。所以他们是(更)更安全的赌注。
答案 5 :(得分:0)
与大多数此类问题一样,答案是“这取决于......”。您是否关心排序是否稳定,即如果键相等的元素在排序后保留其原始相对排序?你只关心原始速度吗?简单的实施是否重要?记忆消耗是否重要?
就个人而言,我会总是选择一个稳定的排序算法,因为我愿意为我认为“合理”的行为牺牲一些原始速度,而且非常稳定的排序太频繁了“不合理”。所以我倾向于使用合并排序算法,这种算法快速且相当简单,但它确实使用了额外的内存。合并排序的另一个优点是,如果数据已经排序,其复杂度为O(n),因此对于接近排序的数据,它应该接近O(n)。
因人而异。
答案 6 :(得分:0)
性能是否至关重要(由分析器验证)?否则,只需使用您的framework / langauge的默认排序(可能是quicksort)。它会表现得很好。