“外部”是一种分区数组到k部分

时间:2015-10-28 19:05:29

标签: algorithm sorting

我想这并没有被再次询问,因为我搜索了很多答案。

我正在研究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)排序数组”,但我们不想像第一个问题那样完全排序,而是从一个完全未排序的数组创建它。无论如何,我一整天都在想着上面的事情。你的方法是什么?

由于

2 个答案:

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