将k个未排序的列表合并为一个并对其进行排序,然后将它们分离为k个排序的列表?

时间:2019-02-05 18:32:01

标签: algorithm np

说我有k个未排序列表,我想将它们合并到一个列表中,这样我就可以对它们运行排序算法,然后我需要将这个大合并列表分开以得到k个排序列表。如何跟踪哪个元素属于哪个列表,以便可以正确分离此合并列表?它需要在线性时间内完成

2 个答案:

答案 0 :(得分:1)

假设我们有n个元素

初始化:
为每个列表中的每个元素添加一个int,说明它属于哪个列表。遍历所有O(n)

合并:
对于每个列表,请使其结尾并指向下一个列表的开头。总时间O(n)

断裂:
创建k指针-新k lists的开始。
遍历排序后的列表,并针对列表中的每个元素将其从新的k lists复制到它表示属于的列表的末尾。
我们可以记住每个新列表的结尾,因此需要O(1)才能到达那里。因此,总时间为O(n)

并将所有时间加在一起-O(n)

答案 1 :(得分:0)

在Python中使用字典,可以很容易地完成。

from collections import OrderedDict
a = [[9,2,5],[6,3,7],[1,8,4]]  #3 unsorted lists with 3 elements in each.
​
key_dict = dict()            # create a dictonary
​
for i in range(len(a)):      # iterate over each nested-list
    for val in a[i]:         # iterate over each element of the nested list
        key_dict[val] = i    # each element in dict contains the index of the nested list 
                             # it belongs to as a value, the key is the element itself
​
​
sorted_dict = OrderedDict(sorted(key_dict.items(), key=lambda x: x[0])) #sorting elements collectively
​
new_list = [[] for i in range(3)]       # you can change it to number of nested lists present.
​
for k, v in sorted_dict.items():
    new_list[v].append(k)
print(new_list)     # Output : [[2, 5, 9], [3, 6, 7], [1, 4, 8]]

除了对元素进行排序之外,每个步骤都需要O(n)时间来运行,这完全是您所期望的。