关闭

求两数组中位数

标签: c++求中位数
241人阅读 评论(0) 收藏 举报
分类:

求两个升序数组A,B的中位数。

算法基本思想:先求两个数组的中位数,分别设为a,b。

当a=b,则a(b)就是中位数。

当a<b时,舍弃数组A中较小的部分,舍弃B中较大的部分(从中位数的位置开始划分)。--舍弃的部分对于后来求中位数的过程没有帮助了,就可以舍弃了。

当a>b时相反。

程序要注意数组元素个数奇偶问题。

算法时间复杂度为O(logn),空间复杂度为O(1)

#include <iostream>
using namespace std;
int a[100]={1,3,5,7,9,11};
int b[100]={2,4,6};
int main()
{
    int la=6,lb=3;
    int m1,m2;
    int la1=0,la2,lb1=0,lb2;
    la2=la-1;//la1,la2,lb1,lb2分别为两个数组的头尾指针
    lb2=lb-1;
    while(true)
    {
        if(la1==la2&&lb1==lb2)//当头尾指针都重合时,表示最后收敛
        {
            m1=a[la1];
            m2=b[lb1];
            if(m1<=m2) cout<<m1<<endl;
            else
            {
                cout<<m2<<endl;
            }
            return 0;
        }
        m1=a[(la2+la1)/2];
        m2=b[(lb2+lb1)/2];
        cout<<"m1--"<<m1<<"   m2--"<<m2<<endl;
        if(m1==m2)
        {
            cout<<m1<<endl;
            return 0;
        }
        else if(m1<m2)//如果数组a的中位数小于b的,数组a头指针后移,b尾指针前移
        {
            if((la2-la1)==1) la1++;//判断当元素个数为偶数时,要手动后移指针
            else
            {
                la1=(la2+la1)/2;
            }
            lb2=(lb2+lb1)/2;
        }
        else if(m1>m2)
        {
            la2=(la2+la1)/2;
            if((lb2-lb1)==1) lb1++;
            else
            {
                lb1=(lb2+lb1)/2;
            }
        }
    }
    return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10022次
    • 积分:261
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类