目前,我被分配编写插入排序算法的递归版本。我做到了。事实上,这里是这样的:
void recursiveInsertionSort(int* inputArray, int p, int q)
{
while (q > p)
{
recursiveInsertionSort(inputArray, p, q-1);
if (inputArray[q-1] > inputArray[q])
{
int temp = inputArray[q];
int temp2 = inputArray[q-1];
inputArray[q] = temp2;
inputArray[q-1] = temp;
q--;
}
}
}
我的问题是双重的。首先,我不确定我提出的递归关系是否正确。我想出了
T(n) = T(n-1) + T(n^2)
作为我的递归关系。那正确吗?我在这之间弹跳
T(n) = T(n^2)
其次,我应该用代数来证明
f(n) = ((n+1)n / 2)
解决了该递归关系。我真的很难做到这一点,因为 A. 我不确定我的复发是否正确,B. 我有时在数学上很糟糕。
对于任何问题的任何帮助将不胜感激。
谢谢。
好吧,我在数学教授的帮助下设法弄清楚了:P 我要把它留在这里,以便其他人知道该怎么做。有人应该将其复制为答案:D
所以这个的递归关系应该是 T(n) = T(n-1) + n 而不是我原来的,这是主要问题。为什么?好吧,这是执行 n-1 的递归回溯所需的时间,因为如果您要转到 n,您将只有一个元素,并且已经排序。加上进行一次插入或一次实际排序所需的时间。
那是 n 的原因是因为当你到那里时,你正在检查一个数字与它之前的每个数字,这恰好是 n 次。
现在你如何证明函数 f(n) 解决了 T(n)?
我们知道 f(n) 解决了 T(n)。所以这意味着你可以这样做:
We know that f(n) is equal to (n(n+1))/2 . So if T(n) is equal to T(n-1) + n, that means we take away 1 from every n in f(n) and then plug that into T(n).
That gives us T((n+1-)n-1)/2)) + n . That simplifies to T((n(n-1)/2) + n. Take that + n thats out there and multiply it by 2/2 to be able to have it all over a common denominator. Giving you (n^2 - n + 2n)/2 . Simplifies down to ((n^2) + n)/2 which further simplifies to, if you factor out an n, (n(n+1))/2. Which is f(n).
哇!