对具有n个固定段的列表进行排序已按升序排序

时间:2018-01-14 22:43:07

标签: algorithm sorting

问题如下:

  

由连接的小的固定数量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。 ()是否只指出段

1 个答案:

答案 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)

值得注意的是,除非这只是一个练习,否则你可能最好使用你选择的语言使用的任何内置排序功能。