1)算法的基本设计思想:
分别求两个升序序列的中位数a,b
若a=b,则a或b即为所求中位数
若a<b,则舍弃A中较小的一半(中位数偏小,往后面找),同时舍弃序列B中较大的一半,两次舍弃长度相同
若a>b,同理
重复上述过程知道两个序列中均只含一个元素时为止,较小者即为所求中位数。
2)c语言描述:
int mid_search(int A[],int B[],int n){int s1=0,d1=n-1,m1,s2=0,d2=n-1,m2;while(s1!=d1||s2!=d2){m1=(s1+d1)/2;m2=(s2+d2)/2;if(A[m1]=B[m2])return A[m1];if(A[m1]<B[m2]){if((s1+d1)%2==0){//元素为奇数个s1=m1;d2=m2;}else{//元素个数为偶数个s1=m1+1;//舍弃中间点d2=m2;}}else{//A[m1]>B[m2]if((s2+d2)%2==0){d1=m1;s2=m2;}else{d1=m1;s2=m2+1;//舍弃中间点}}}return A[s1]<B[s2]?A[s1]:B[s2];
}
3)算法时间复杂度为O(log2 n) 空间复杂度为O(1)
算法的原理是基于中位数的定义:对于一个有序序列,它的中位数是该序列中所有元素的中间值,即使序列长度为奇数时,它也正好位于序列的中间位置,如果长度为偶数,则是中间两个元素的平均值。
这个算法的思路在于通过每一步的比较来缩小搜索范围,直到找到两个序列的中位数。具体来说,它的步骤如下:
1. 分别求两个有序序列的中位数。
2. 比较这两个中位数的大小。
- 如果两个中位数相等,则它们就是整个序列的中位数。
- 如果一个中位数小于另一个中位数,那么说明这个中位数之前的元素一定不可能是整个序列的中位数,因此可以舍弃它们,同时舍弃另一个序列中对应位置之后的元素。
3. 重复以上步骤,直到两个序列中都只剩下一个元素为止,此时较小的那个元素就是整个序列的中位数。
为什么最后较小的元素为中位数呢?这是因为在每一步中,我们都根据两个序列的中位数的比较结果,舍弃了一定范围的元素,保留的元素范围都是包含中位数的。因此,当两个序列都只剩下一个元素时,较小的那个元素必定是整个序列的中位数,因为舍弃的范围里不可能包含比它更小的元素了。