递归程序在设计时很常见,有时能很大程度上简化问题解决的复杂性.
下面就算法导论的2.3-4习题进行解答.
具体就是写出插入排序的递归版本.
1 void insert_sort(int a[],int n) 2 { 3 if(n==1) return ; 4 else 5 { 6 insert_sort(a,n-1); 7 int i=n-1,temp=a[n]; 8 while(a[i]>=temp&&i>=1) a[i+1]=a[i],i--; 9 a[i+1]=temp; 10 } 11 }
瞧,过程很简洁.
但是要注意这个写法的效率是很低的.不论是空间还是时间都消耗很大.
递归式为:t[n]=t[n-1]+cn,所以时间消耗是n^2的.
另有一点需要说明,调用它时最大消耗递归栈空间有N个栈空间,通常栈空间是有限的,不可能无限制的随意使用递归啊.否则输入数据的变化多端很容易导致系统崩溃.
另延伸一点:2.3-5习题:
习题要求我们做出有关有序二分搜索的例子.
大致思想在题目中就给出了.下面我用代码实现一下子.
1 void binary_search(int a[],int le,int ri,int x) 2 { 3 while(le<=ri) 4 { 5 int mid=(le+ri)/2; 6 if(a[mid]==x) return mid; 7 else if(a[mid]<x) le=mid+1; 8 else ri=mid-1; 9 } 10 return -1; 11 } 12 13 int binary_sear(int a[],int le,int ri,int x) 14 { 15 int mid=(le+ri)/2; 16 if(le>ri) return -1; 17 if(a[mid]==x) return mid; 18 else if(a[mid]>x) return binary_sear(a,le,mid-1,x); 19 else return binary_sear(a,mid+1,ri,x); 20 }
以上仅限于有序数组的数字的二分搜索. 具体的搜索可视情况而定.
至于2.3-6习题.
显然是不能用二分搜索来优化结果的.这是源于数组自身的缺陷,导致其不能在常数时间内完成数据的插入和删除.
不过我们还是可以用二分搜索来尝试一下的.
但是我是不会去尝试的.
最后,2.3-7习题的解答是有点复杂的.
我能想到的就是先用归并排序,在对其进行遍历,对每一层遍历都尝试用二分搜索来看看是否有能够匹配的?时间也是nlogn