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