选择排序递归关系

时间:2016-04-03 20:10:57

标签: algorithm sorting recursion time-complexity recurrence

这是一个家庭作业问题,但我很难理解复发关系。我在互联网上搜索了一些例子,他们对我很模糊。我知道递归算法的递归关系不具备处理每个算法的固定方式,但我对如何理解它们感到迷茫。这是我必须使用的算法:

void selectionSort(int array[]) {
   sort(array, 0); 
} 

void sort(int[] array, int i) {
   if (i < array.length - 1) 
   { 
      int j = smallest(array, i);    T(n) 
      int temp = array[i]; 
      array[i] = array[j]; 
      array[j] = temp; 
      sort(array, i + 1);    T(n)
   } 
} 

int smallest(int[] array, int j)     T(n - k)
{ 
   if (j == array.length - 1) 
      return array.length - 1; 
   int k = smallest(array, j + 1); 
   return array[j] < array[k] ? j : k; 
}

所以根据我的理解,这就是我想出的:T(n)= T(n - 1)+ cn + c T(n-1)表示sort的递归函数,并且添加的cn表示最小的递归函数,当n减小时它应该减小,因为它只调用每次在数组中剩余的次数。常量乘以n是以最小值运行附加代码的时间量,附加常量是在sort中运行附加代码的时间量。这是正确的吗?我完全不在了吗?我没有正确解释吗?另外一步是创建一个递归树,但我不认为这个等式为T(n)= aT(n / b)+ c的形式,如果我理解,这是树所需的形式这个权利。另外,如果正确,我也不会看到我的递归关系如何达到n ^ 2。这是我的第一篇文章,所以如果我在这里做错了,我道歉。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

计算时间复杂度的最简单方法是使用单独的递归关系对每个函数的时间复杂度进行建模。

我们可以使用递归关系smallestS(n) = S(n-1)+O(1)来模拟函数S(1)=O(1)的时间复杂度。这显然解决了S(n)=O(n)

我们可以使用sortT(n) = T(n-1) + S(n) + O(1)来模拟T(1)=O(1)函数的时间复杂度。 S(n)一词是因为我们在函数smallest中调用sort。因为我们知道S(n)=O(n)我们可以写T(n) = T(n-1) + O(n),并写出重复,我们得到T(n)=O(n)+O(n-1)+...+O(1)=O(n^2)

因此预计总运行时间为O(n^2)

答案 1 :(得分:0)

在选择排序算法

我们的外循环运行n-1次(n是数组的长度),因此将进行n-1次传递...然后将元素与其他元素进行比较....所以n-1比较< / p>

T(n)= T(n-1)+ n-1

通过求解特定关系可以证明为O(n ^ 2)。