我对编写下面算法的递归方程感到困惑,有人可以帮我这样做吗?
以下是算法:
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
}
}
答案 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)