使用预定义的排序顺序对数组进行排序

Sort an array with a pre-defined sort order

我需要递归地对 k 排序数组进行排序,其中数组是一组 "sort of" 排序值。

一个 k 排序的数组由以下等式定义 A[i] <= A[i + k] 对于每个 i

这方面的一个例子是 数组 {6, 1, 3, 7, 2, 4}

k = 3
这是因为 A[0] <= A[3], A[1] <= A[4], A[2] <= A[3]
其中 A[i] <= A[i + k]

我怎样才能着手解决这个问题?需要递归完成,我什至不知道从哪里开始。

让我们调用你的数组 A,其中 k = k_original。

要以递归方式执行此操作,您可以将其分成 2 个较小的数组 他们的 k = k_original / 2.

例如:您的 k_original = 5,然后将其分成 2 个数组,k=3 和 k=2。

  • 首先用 (k=3) 取元素:A[0]、A[1]、A[2]、A[5]、A[6]、A[7] , A[10], A[11], A[12], ... 只取3个元素并跳过接下来的2个(它们用于另一个小数组),按照问题的规则,A[0] < A[ 5], A[1] < A[6], ... 所以这个小数组满足 (k=3)

  • 其余元素进入第二个数组(在本例中为 k=2),它们也将满足 (k=2) 的规则。

继续分解,如果分解后,(k=1)然后return数组,你可以确定它已经排序了。

然后用 2 个较小的已经排序的数组,只需 merge 2 sorted array 将它们组合起来。

这是我的伪代码:

function sortK (A, k) :
    if (k=1) return A;
    A_first_half = A[0 ~ k/2] + A[k ~ 3k/2] + A [2k ~ 5k/2] + ...
    A_second_half = A[k/2 ~ k] + A[3k/2 ~ 2k] + A[5k/2 ~ 3k] + ...
    sorted_first_half = sortK (A_first_half, k/2);
    sorted_second_half = sortK (A_second_half, k/2);
    return merge(A_first_half, A_second_half);

注意:当 k 不能被 2 整除时,你需要注意 case,但这真的不难,就像我的例子一样。