我只想到了一种有趣的方法来进行排序。我敢肯定以前有人想过它,但我从未见过它。它分两步进行:
1 - 遍历输入列表,将有序(不一定是连续)的项目序列拉出到箱子中。为每个传递创建一个bin,直到列表为空。
2 - 使用标准合并(重复选择最低的第一个元素)将已排序的二元合并回来
这是我用Python制作的原型。下面的输出可能更有启发性。
items = len(unsorted)
sortedBins = []
# Pull out bins of sorted numbers, until the unsorted list is depleted:
while( len(unsorted) > 0 ):
print "Unsorted list: " + `unsorted`
highest = float("-inf")
newBin = []
i = 0
while( i < len(unsorted) ):
# Find items in unsorted list that are in order, pop them out:
if( unsorted[i] >= highest ):
highest = unsorted[i]
newBin.append( unsorted.pop(i) )
i=i+1
sortedBins.append(newBin)
print "bin[%i]: "%(len(sortedBins)-1) + `newBin`
print
# Merge all of the sorted bins together:
sorted = []
while( len(sorted) < items ):
lowBin = 0
for j in range( 0, len(sortedBins) ):
if( sortedBins[j][0] < sortedBins[lowBin][0] ):
lowBin = j
print "lowBin: %i: %i" % (lowBin, sortedBins[lowBin][0])
sorted.append( sortedBins[lowBin].pop(0) )
if( len(sortedBins[lowBin]) == 0 ):
del sortedBins[lowBin]
print "sorted:" + `sorted`
如果我不疯狂,那么最坏的情况(一个完全颠倒的列表)似乎需要 n(n + 1)时间(即n(n + 1)/ 2每个循环)。最好的情况(已经排序的列表)需要 2 * n 时间。
编辑:它现在运行,所以停止抱怨。这是输出,它进一步说明了它的工作原理:
Unsorted list: [1, 4, 3, 8, 3, 7, 9, 4, 8, 9, 3]
bin[0]: [1, 3, 3, 9, 9]
Unsorted list: [4, 8, 7, 4, 8, 3]
bin[1]: [4, 7, 8]
Unsorted list: [8, 4, 3]
bin[2]: [8]
Unsorted list: [4, 3]
bin[3]: [4]
Unsorted list: [3]
bin[4]: [3]
lowBin: 0: 1
lowBin: 0: 3
lowBin: 0: 3
lowBin: 4: 3
lowBin: 1: 4
lowBin: 3: 4
lowBin: 1: 7
lowBin: 1: 8
lowBin: 1: 8
lowBin: 0: 9
lowBin: 0: 9
sorted:[1, 3, 3, 3, 4, 4, 7, 8, 8, 9, 9]
答案 0 :(得分:4)
我相信您正在查看 strand sort ,这是一个修改后的merge sort,可以通过查找和删除原始数组中增加值的“链”来实现,然后将所有股线合并在一起。如果输入序列已经排序,它具有最佳情况运行时O(n),并且O(n 2 )的平均和最差情况运行时间都是,因为算法可能必须进行n次传递在数组上,每次只拉出一个元素。
所以,之前已经发现了这种排序算法,但是你最好只使用标准的合并排序,因为性能要好得多。
希望这有帮助!
答案 1 :(得分:2)
看起来像一个选择排序,其优化启发式从最后选择的索引开始,而不是从头开始,然后在“合并”序列中弥补其成本。你是对的,它是一个O(n ^ 2)算法。它最好用大多数排序(按降序排列)列表,但我无法想象它的平均性能比仅仅选择排序更好的情况,所以我怀疑之前是否有人制作/命名了这个算法。 / p>
答案 2 :(得分:2)
也许其他人建议有一些小错误,我能够遵循你的逻辑。我仍然称它为合并排序,修改了分区策略。
答案 3 :(得分:1)
看起来像一个倒排的垃圾桶。您不是按顺序放置存储桶然后将元素放入其中然后对它们进行排序,而是寻找“免费”排序存储桶(除了进行比较以确定它们的排序成本是否与实际排序值相同,因此它不是实际上对随机数据采用任何方式“免费”,然后按顺序放置已排序的存储桶。
在随机数据上,这个算法通常会产生很多不止一个项目的桶,在这种情况下,它谴责在开始时有一个无用且昂贵的循环,然后在第二个循环中进行标准排序。