算法导论-递归

递归程序在设计时很常见,有时能很大程度上简化问题解决的复杂性.

下面就算法导论的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

 

posted @ 2020-03-01 13:56  SSXFC  阅读(209)  评论(0编辑  收藏  举报