我想这并没有被再次询问,因为我搜索了很多答案。
我正在研究k-排序的数组(远离正确位置的最大k个单位),我完全了解并且选择解决方案是O(n * logk),使用最小堆等(check this)。
现在我看到了以下问题:假设你有一个数组A,它被分成k个部分。 A1,A2,A3,...,Ak。无需要求每个Ai排序,你想让A1的每个元素都小于A2等的每个元素。
例如:A [2,5,3,1,5,7,10,0]和k = 2 A1 = [2,3,1,0]和A2 = [5,5,7,10]。 A1,A2内元素的顺序完全无关紧要,但我们关心A1的每个元素都小于A2。
好吧,似乎这两个问题是相互关联的。实际上在第二个问题中我们看到它是一个“(k-1)排序数组”,但我们不想像第一个问题那样完全排序,而是从一个完全未排序的数组创建它。无论如何,我一整天都在想着上面的事情。你的方法是什么?
由于
答案 0 :(得分:1)
一种方法是修改快速排序,以便在要排序的数组足够短时终止。
这应该降低O(nlogk)的典型复杂度,但正如快速排序一样,它仍然可能具有O(n ^ 2)最坏情况的复杂性。
以下是将阵列A分区为k个分区的示例Python实现:
def qsort_block(arr, num, missing = 0):
"""Return array where max of each block is <= min of the next block.
Each block should of length <num>, except the first is <missing> shorter.
"""
if len(arr) <= num - missing:
return arr
below = [x for x in arr[1:] if x<arr[0]]
above = [x for x in arr[1:] if x>=arr[0]]
return qsort_block(below,num,missing) + [arr[0]] + qsort_block(above,num,(missing+len(below)+1) % num)
A = [2, 5, 3, 1, 5, 7, 10, 0]
k = 2
num = len(A)/k
print qsort_block(A,num)
打印:
[1, 0, 2, 3, 5, 5, 7, 10]
AAAAAAAAAAA BBBBBBBBBBB
因此,A分区中的所有数字都小于B分区中的数字。
答案 1 :(得分:0)
你绝对应该根据分区阅读K-select algorithm。