问题如下:
由连接的小的固定数量n组成的列表 端到端,每个细分已经按升序排列。
我考虑过使用带有基本情况的mergesort,如果等于n然后返回并合并它们,因为我们已经知道它们已经排序了,但是如果我有3个段,它就不会工作,因为我是除以2,你不能将3个段平分为两个部分。
另一种类似于合并排序的方法。所以我为每个段使用n个堆栈,如果L [i]>我们可以识别它们。 L [i + 1]因为段是按升序排列的。但是我需要进行n次比较以找出哪个元素首先出现,而且我不知道一种有效的方法来动态比较n个元素而不使用其他数据结构来比较堆栈顶部的元素。 此外,您应该使用问题功能,已经订购的段,以获得比传统算法更好的结果。即复杂度小于O(nlogn)。
如果你有一个想法,伪代码会很好。
修改:
一个例子是[(14,20,22),(7,8,9),(1,2,3)]这里我们有3个3个元素的分段,即使这些分段是整齐的,整个列表不是。
P.S。 ()是否只指出段
答案 0 :(得分:1)
我想也许你误解了mergesort。虽然通常你会分成两半并在合并之前对每一半进行排序,但它实际上是制作算法的合并部分。你只需要在运行中合并。
以[(14,20,22),(7,8,9),(1,2,3)]
首次合并后,您有[(7, 8, 9, 14, 20, 22),(1, 2, 3)]
第二次合并后,您有[(1, 2, 3, 7, 8, 9, 14, 20, 22)]
l = [14, 20, 22, 7, 8, 9, 1, 2, 3]
rl = [] # run list
sl = [l[0]] # temporary sublist
#split list into list of sorted sublists
for item in l[1:]:
if item > sl[-1]:
sl.append(item)
else:
rl.append(sl)
sl = [item]
rl.append(sl)
print(rl)
#function for merging two sorted lists
def merge(l1, l2):
l = [] #list we add into
while True:
if not l1:
# first list is empty, add second list onto new list
return l + l2
if not l2:
# second list is empty, add first list onto new list
return l + l1
if l1[0] < l2[0]:
# rather than deleting, you could increment an index
# which is likely to be faster, or reverse the list
# and pop off the end, or use a data structure which
# allows you to pop off the front
l.append(l1[0])
del l1[0]
else:
l.append(l2[0])
del l2[0]
# keep mergins sublists until only one remains
while len(rl) > 1:
rl.append(merge(rl.pop(), rl.pop()))
print(rl)
值得注意的是,除非这只是一个练习,否则你可能最好使用你选择的语言使用的任何内置排序功能。