了解运行时间的重复发生

时间:2013-09-15 02:40:47

标签: algorithm sorting recursion recurrence

我正在通过CLRS进行算法简介中的练习。这不是分级作业或任何东西,我只是想了解问题。

问题如下:

  

我们可以将插入排序表达为递归过程,如下所示。在   为了排序A [1..n],我们递归地排序A [1..n-1]和   然后将A [n]插入已排序的数组A [1..n-1]。写一个   此递归插入版本的运行时间重复   排序

解决问题的方法:

  

由于在最坏的情况下需要O(n)时间才能将A [n]插入   排序数组A [1。 .n -1],如果n = 1,我们得到递归T(n)= O(1)   ,   如果n> T,则T(n-1)+ O(n) 1。这种复发的解决方案是T(n)= O(n ^ 2)。

所以我知道如果n = 1,那么它已经被排序,因此需要O(1)时间。 但我不明白复发的第二部分: O(n)部分是我们将被排序的元素插入到数组中的步骤,该数组在最坏的情况下接收O(n)时间 - 我们必须遍历整个数组并在其末尾插入的情况。

我无法理解它的递归部分(T(n-1))。 T(n-1)是否意味着每个递归调用我们正在排序一个较少的数组元素?这似乎不对。

2 个答案:

答案 0 :(得分:9)

是的,它来自:

  

为了对A [1..n]进行排序,我们递归地对A [1..n-1]进行排序,然后进行排序   将A [n]插入已排序的数组A [1..n-1]

“递归排序A [1..n-1]”部分需要T(n-1)次(这很容易:我们定义 T(n)表示“排序n个元素所需的时间“,因此对n-1个元素进行排序所需的时间通常为T(n-1)),而”将A [n]插入到已排序的数组A [1..n-1]中“部分采用(最坏情况)O(n)时间。将它们添加到一起以获得

  

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

答案 1 :(得分:0)

我将使用递归解释我对使用递归的插入排序的python代码的理解,如下所示:

def insert_sort_r(A,n)

if n==1:

    pass

else:------------------------------------ c1
    insert_sort_r(A,n-1) ---------------- T(n-1)

    key = A[n-1]------------------------- c2
    i = n-2 ------------------------------c3

    while i>-1 and A[i] > key:------------c4*(n)
        A[i+1] = A[i]---------------------c5*(n-1)
        i = i-1---------------------------c6*(n-1)
    A[i+1] = key--------------------------c7

每个步骤所用的时间由“c”值表示,而且还显示了所采取的步骤数。我们将步骤“insert_sort_r(A,n-1)”中的(n-1)个元素的排序时间表示为T(n-1),因为我们不确切地知道该值在n方面是什么。这是递归的想法。表示当值为n时的情况的等式,其中值为(n-1)。