我正在通过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)是否意味着每个递归调用我们正在排序一个较少的数组元素?这似乎不对。
答案 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)。