2

目前,我被分配编写插入排序算法的递归版本。我做到了。事实上,这里是这样的:

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).

哇!

4

0 回答 0