如何对主要排序的数组进行排序

时间:2009-12-10 12:06:24

标签: c# .net algorithm sorting

我有一个这样的数组:
1,2,3,5,6,4 它有99%的分类,有40K元素 我可以把它们放在一个数组,列表,链表,...中 但我不知道对它们进行分类的最快方法!

7 个答案:

答案 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%未分类的含义。如果有少数元素被取代,但接近目标位置则可能有效。

InsertionSortShellSort几乎总会赢。即使在CocktailSort理论上会更好的情况下,差异也会很小。所以他们是(更)更安全的赌注。

答案 5 :(得分:0)

与大多数此类问题一样,答案是“这取决于......”。您是否关心排序是否稳定,即如果键相等的元素在排序后保留其原始相对排序?你只关心原始速度吗?简单的实施是否重要?记忆消耗是否重要?

就个人而言,我会总是选择一个稳定的排序算法,因为我愿意为我认为“合理”的行为牺牲一些原始速度,而且非常稳定的排序太频繁了“不合理”。所以我倾向于使用合并排序算法,这种算法快速且相当简单,但它确实使用了额外的内存。合并排序的另一个优点是,如果数据已经排序,其复杂度为O(n),因此对于接近排序的数据,它应该接近O(n)。

因人而异。

答案 6 :(得分:0)

性能是否至关重要(由分析器验证)?否则,只需使用您的framework / langauge的默认排序(可能是quicksort)。它会表现得很好。