如何写这个算法的递推方程?

时间:2015-03-26 10:00:54

标签: algorithm recurrence

我对编写下面算法的递归方程感到困惑,有人可以帮我这样做吗?

以下是算法:

ThreeSort(A{i..j]){
    n = j-i+1; // number of elements
    if (n==1) return;
    if (n==2) and (A[i] > A[j]) then swap A[i] with A[j]
    else if (n > 2) {
        third = round(n/3);
        ThreeSort(A[i..j-third]); // sort first 2/3rds
        ThreeSort(A[i+third..j]); // sort last 2/3rds
        ThreeSort(A[i..j-third]); // sort first 2/3rds
    }
}

3 个答案:

答案 0 :(得分:0)

这不是一个答案,但是太长了,无法放入评论区域,所以我在这里发布。

如果round()汇总,您的代码就错了。假设n==5和数组包含项6,5,3,2,1。然后你得到third==2(因为5/3 = 1.666 ......被四舍五入)然后三步子排序将数组重新排序为:

3,5,6,2,1
3,5,1,2,6
1,3,5,2,6

您需要至少与侧面部分长度相等的中间(重叠)部分,因此third不得超过n/3才能正确完成排序。这意味着您需要trunc而不是round

答案 1 :(得分:-1)

您必须将阵列分成三部分。第一部分是A[i...i+third-1],第二部分是A[i+third...i+2*third-1],第三部分是A[i+2*third...j]。排序后

ThreeSort(A[i...i+third-1]);
ThreeSort(A[i+third...i+2*third-1]);
ThreeSort(A[i+2*third...j]);

您必须将数组的三个部分合并为一个。 三重合并看起来像二进制合并。

答案 2 :(得分:-1)

我不确定,但我认为确定时间复杂度的递归方程是 T(N)= 3 * T(N / 3)+θ(1) 并根据主法: T(n)∈θ(n)