题目:(见于《算法导论》原书第二版P22,2.3-4)
插入排序可以如下改成一个递归过程:为排序A[1…n],首先递归地排序A[1…n-1],然后再将A[n]插入到已排序的数组A[1…n-1]中去。对于插入排序的这一递归版本,为它的运行时间写个递归式。
在看《算法导论》之前,从来没有想过使用递归的方式实现插入排序。
此前对于插入排序,很容易就想到了这段代码:
1 void insertsort(vector<int> a, int n) 2 { 3 int i,j,temp; 4 for(i=1; i<n; i++) 5 { 6 temp=a[i]; 7 for(j=i; j>0&&temp<a[j]; j--) 8 { 9 a[j]=a[j-1]; 10 } 11 a[j]=temp; 12 } 13 }
如今在《算法导论》此书看到这道题,就尝试了一下使用递归的方式实现插入排序:
1 #include<iostream> 2 using namespace std; 3 4 void insert(int a[], int n) 5 { 6 int temp=a[n]; 7 for(int i=n-1; i>=0 &&temp<a[i]; i--) 8 a[i+1]=a[i]; 9 a[i+1]=temp; 10 } 11 12 void insertsort(int a[], int n) 13 { 14 if(n>0) 15 { 16 insertsort(a,n-1); 17 insert(a,n); 18 } 19 } 20 21 int main() 22 { 23 int a[10]={2,3,1,6,4,7,9,8,0,5}; 24 insertsort(a,10); 25 for(int j=0; j<10; j++) 26 cout<<a[j]<<" "; 27 cout<<endl; 28 return 0; 29 }
关于运行时间的递归式就不写了。
推荐一下:MIT算法导论的网络课程