公式,及其求解过程)
答:
void MergeSort (int A[],int low,int high) { int middle;
if (low middle=(low+high)/2; //取中点 MergeSort(A,low,middle); MergeSort(A,middle+1,high); Merge(A,low,middle,high); //合并算法 } } void Merge(int A[],int low,int middle,int high) //合并过程描述: { int i,j,k; int *B=new int[high-low+1]; i=low; j=middle+1; k=low; while(i<=middle&&j<=high) { //两个子序列非空 if(A[i]<=A[j]) B[k++]=A[i++]; else B[k++]=A[j++]; } while (i<=middle) B[k++]=A[i++]; //子序列A[low,middle]非空,将A复制到B while (j<=high) B[k++]=A[j++]; /子序列A[middle+1, high]非空,将A复制到B for(i=low;i<=high;i++) A[i++]=B[i++]; //将合并后的序列复制回A } ? 合并排序算法运行时间T(n)的递归形式为: O(1)n=1?T(n)=? n>1?2T(n/2)+O(n) ? 分析该算法时间复杂度: 令T(n)为元素个数为n时所需比较次数(时间): 当n=1时, 时间复杂度记为O(1)。 当n>1时,T(n)=2 T(n/2) + O(n) 2 =2 (2T(n/2)+O(n/2) ) + O(n) 22 =2T(n/2) + 2 O(n) 33 =2T(n/2) + 3O(n) =?? xx =2 T(n/2) + x*O(n) x 分解到最后只有2个元素可以求解,n/2=1, x=logn; 故 T(n)=n*T(1)+n*logn ,故时间复杂度记为:O(n * logn) 4、金块问题(求最大最小元问题) 老板有一袋金块(共n块),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最 轻的一块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最重的金块。 要求:1)设计一算法求解该问题? (分治法解) 2)计算其时间复杂度?(要求写出递推公式,及其求解过程) 答:递归求取最大和最小元素 maxmin (int i, int j ,float &fmax, float &fmin) { int mid; float lmax, lmin, rmax, rmin; if (i=j) {fmax= a[i]; fmin=a[i];} //只有1个元素 else if (i=j-1) //只有2个元素

