当前位置: 首页 > 知识库问答 >
问题:

排序已按升序排序的n个固定段的列表

夏骞尧
2023-03-14

问题如下:

由一个固定数量的n个端到端连接的段组成的列表,每个段已经按升序排列。

我考虑过使用mergesort,基本情况是,如果等于n,那么返回并合并它们,因为我们已经知道它们是排序的,但是如果我有3个段,它将不起作用,因为我除以2,你不能将3个段平均分成两部分。

另一种方法类似于合并排序。所以我对每个段使用n个堆栈,如果L[i],我们可以识别它

如果你有主意的话,伪代码会很好。

编辑:

一个例子是[(14,20,22),(7,8,9),(1,2,3)],这里我们有3段3个元素,即使这些段被排序了,整个列表也没有。

p. s.()仅用于指出段

共有1个答案

孙永思
2023-03-14

我想你可能误解了我的意思。通常情况下,在合并之前,你会把每一半分成两半,并对每一半进行排序,但实际上是合并部分构成了算法。您只需在运行时合并即可。

使用[(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)

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

 类似资料:
  • 问题内容: 我将要有一个固定的项目清单,直到有一个随机化步骤,我才能运行查询直到执行该查询为止。 我想要以下内容: 假设is_launch_set将返回1,3,7,11,但已被随机分配到以下位置: 关于如何实现这一目标的任何想法?我在想也许是一个find_in_set,但不是很确定。 问题答案: 您可以使用以下任一方法来做到这一点: 要么 要么

  • 我在学校的任务是创建一个程序,以升序排列数组的值。它几乎就在那里,但每当我输入“44 55 66 22 33 11 77 99 88 66”或它输出的任何数字 -858993460,11,22,33,44,55,66,66,77,88,或开头为负数 第一个数字到底怎么了?我是不是缺了什么? 我对C++很陌生,我不太明白这里的问题。如果有什么建议我可以用请告诉他们。 }

  • 我下面的代码不起作用,我也不知道为什么。 它编译得很好,但结果似乎没有排序。

  • 我的教授介绍了如何使用ArrayList创建Max Heap类。然后他让我们写一个maxHeapSort方法。我几乎成功地将堆按降序排序,但我假设排序应该按升序。现在我使用一个最大堆为[11,5,8,3,4,1]的ArrayList,它排序为[11,8,5,3,4,1]。 这是我的maxHeapSort代码: 下面是我的教授给出的heapifyDown方法: 这是我的测试代码:

  • 我有一个通用的链表,目前由int组成,我想在默认情况下按升序排序,然后切换一个布尔值,按降序排序。我该怎么做?

  • 问题内容: 我有一个用户模型和一个提交模型。每个提交都有一个上载用户的外键字段user_submitted。 我的问题很简单:如何获得提交量最多的三个用户的列表? 我尝试在用户模型上创建num_submissions方法: 然后执行: 但这失败了,就像我尝试过的所有其他尝试一样。我实际上可以使用智能数据库查询吗?还是我应该在视图文件中做些更怪异的事情? 问题答案: 你没有在示例模型代码中提及,但在