我刚刚开始CLRS。第二章的第一个问题涉及当子数组达到指定的最小大小时,通过使用插入排序来粗化合并排序算法。我已经编写了修改后的代码,我认为它是正确的,因为我已经在一些输入和 coarseness 的不同值上进行了检查。对于某些隐秘的案例,我不太确定。 谁能告诉我是否可以进一步即兴创作。 这是修改后的合并排序过程(以theta表示的运行时间为(nk + nlg(n / k)):
void mergesort(int arr[], int p, int r, int k) { // k is the coarseness
int q = (p + r) / 2;
if (r - p + 1 > k) { // when the size of the subarray is atmost k, sort using insertion sort
mergesort(arr, p, q, k);
mergesort(arr, q + 1, r, k);
merge(arr, p, q, r); // merge is the standard procedure
}
else {
insort(arr, p, r); // insort is the standard insertion sort procedure
}
}
此外,问题的第3部分询问该过程的运行时间与标准mergesort算法相同的k的最大值。我试图将两个过程的theta表示法等价(nk + nlg(n / k)= nlgn),但是可以做到吗?这样做是否有效,因为我没有得到一个明智的答案。任何帮助将不胜感激。谢谢。