/*
编写递归算法int max(int a[],int left, int right),求数组a[left..right]中的最大数。
*/#include"ArrayIo.h"/*请将本函数补充完整,并进行测试*/intmax(int a[],int left,int right){int l, r, mid;if(left >= right)return a[left];//设置递归终止条件else{
mid = left + right >>1;
l =max(a, left, mid);//不断的划分为子问题
r =max(a, mid +1, right);return l > r ? l : r;//三目运算符}}intmain(){int a[10];input(a,10);print(a,10);printf("数组的最大数是:%d\n",max(a,0,9));return0;}
第二题
/*
请编写一个递归算法函数void partion(int a[], int left, int right),
将数组a[left..right]中的所有奇数调整到表的左边,所有偶数调整到表的右边。
*/#include"ArrayIo.h"#defineN10/*请将本函数补充完整,并进行测试*/voidpartion(int a[],int left,int right){while(left < right && a[left]%2==1) left++;//跳转到第一个需要交换的位置while(left < right && a[right]%2==0) right--;if(left < right){
a[left]= a[left]+ a[right];//不需要提供额外的空间来存储变量
a[right]= a[left]- a[right];
a[left]= a[left]- a[right];partion(a, left +1, right -1);}}intmain(){int a[N];init(a,N);/*随机产生N个数*/print(a,N);partion(a,0,N-1);print(a,N);return0;}
第三题
/*
请编写递归函数void bubbleSort(int a[],int n),
对长度为n的数组采用冒泡法进行升序排序。
请编写递归函数int binSearch(int a[], int left, int right,int key),
采用二分查找法在数组a[left..right]中查找值为key的元素所在的位置,
若查找失败函数返回-1。
*/#include"ArrayIo.h"#defineN10/*请将本函数补充完整,并进行测试*/voidbubbleSort(int a[],int n){int i, flag =0;//flag的作用为判定该数组是否排好序的依据if(n >0)//递归终止条件{for(i =0; i < n -1; i ++){
flag =0;if(a[i]> a[i +1]){
a[i]+= a[i +1];//无需额外的值交换变量
a[i +1]= a[i]- a[i +1];
a[i]-= a[i +1];
flag =1;}}if(flag)returnbubbleSort(a, n -1);//如果flag == 0 表示这个数组已经排好序了}return;}intbinSearch(int a[],int left,int right,int key){int mid;if(left > right)return-1;//设置递归结束条件else{
mid = left + right >>1;if(a[mid]> key)returnbinSearch(a, left, mid -1, key);//二分返回结果elseif(a[mid]== key)return mid;elsereturnbinSearch(a, mid +1, right, key);}}intmain(){int x,pos,a[N];init(a,N);bubbleSort(a,N);print(a,N);printf("请输入要查找的数:\n");scanf("%d",&x);
pos=binSearch(a,0,N-1,x);if(pos!=-1)printf("a[%d]=%d\n",pos,x);elseprintf("Not found!\n");return0;}