寻找两个正序数组的中位数

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){

    if (nums1Size == 0)

    {

        if (nums2Size == 0)

        {

            printf("error\n");

            exit(1);

        }

        if ( (nums2Size&1) == 0)

        {

            return (double)(nums2[nums2Size>>1]+nums2[(nums2Size>>1)-1]) / 2;

        }

        else

        {

            return nums2[nums2Size>>1];

        }

    }

    else if (nums2Size == 0)

    {

        if ((nums1Size&1) == 0)

        {

            return (double)(nums1[nums1Size>>1]+nums1[(nums1Size>>1)-1]) / 2;

        }

        else

        {

            return nums1[nums1Size>>1];

        }

    }

    else if ( ((nums1Size+nums2Size)&1) == 0 )

    // a+a   a

    // b+b   b

    // a+b    a+b-1

    // nums2[pos2-1] == nums1[pos1]  nums2[pos2]

    // nums1[pos1]   nums2[pos2-1] ==   nums1[pos1+1]      nums2[pos2]

    // 1 2 3 4 5 6 7 8

    // 9 10 11 12 13 14

    // 2a+1   a

    // 2b+1   b

    // a+b+1 a+b

    {

        if ( (nums1Size&1) == 0)

        {

            int pos1=nums1Size>>1;

            int pos2=nums2Size>>1;

            if (nums1[pos1]<nums2[pos2])

            {

                while (1)

                {

                    if (pos1==nums1Size-1)

                    {

                        int sum;

                        int i1=pos1;

                        int i2=pos2-1;

                        if (i2<0 || nums1[i1]>nums2[i2])

                        {

                            sum=nums1[i1];

                            --i1;

                        }

                        else

                        {

                            sum=nums2[i2];

                            --i2;

                        }

                        if (i2<0 || nums1[i1]>nums2[i2])

                        {

                            sum+=nums1[i1];

                        }

                        else

                        {

                            sum+=nums2[i2];

                        }

                        return (double)sum/2;

                    }

                    if (pos2==0)

                    {

                        return (double)(nums1[pos1]+nums1[pos1-1])/2;

                    }

                    --pos2;

                    if (nums2[pos2]<=nums1[pos1])

                    {

                        if (pos2<0 || nums1[pos1-1]>=nums2[pos2])

                        {

                            return (double)(nums1[pos1-1]+nums1[pos1])/2;

                        }

                        else

                        {

                            return (double)(nums2[pos2]+nums1[pos1])/2;

                        }

                    }

                    ++pos1;

                    if (nums1[pos1]>=nums2[pos2])

                    {

                        if (pos2 !=0 && nums2[pos2-1]>=nums1[pos1-1])

                        {

                            return (double)(nums2[pos2-1]+nums2[pos2])/2;

                        }

                        else

                        {

                            return (double)(nums1[pos1-1]+nums2[pos2])/2;

                        }

                    }

                }

            }

            else if (nums1[pos1]>nums2[pos2])

            {

                while (1)

                {

                    if (pos2==nums2Size-1)

                    {

                        int sum;

                        int i2=pos2;

                        int i1=pos1-1;

                        if (i1<0 || nums2[i2]>nums1[i1])

                        {

                            sum=nums2[i2];

                            --i2;

                        }

                        else

                        {

                            sum=nums1[i1];

                            --i1;

                        }

                        if (i1<0 || nums2[i2]>nums1[i1])

                        {

                            sum+=nums2[i2];

                        }

                        else

                        {

                            sum+=nums1[i1];

                        }

                        return (double)sum/2;

                    }

                    if (pos1==0)

                    {

                        return (double)(nums2[pos2]+nums2[pos2-1])/2;

                    }

                    --pos1;

                    if (nums1[pos1]<=nums2[pos2])

                    {

                        if (pos1<0 || nums2[pos2-1]>=nums1[pos1])

                        {

                            return (double)(nums2[pos2-1]+nums2[pos2])/2;

                        }

                        else

                        {

                            return (double)(nums1[pos1]+nums2[pos2])/2;

                        }

                    }

                    ++pos2;

                    if (nums2[pos2]>=nums1[pos1])

                    {

                        if (pos1 !=0 && nums1[pos1-1]>=nums2[pos2-1])

                        {

                            return (double)(nums1[pos1-1]+nums1[pos1])/2;

                        }

                        else

                        {

                            return (double)(nums2[pos2-1]+nums1[pos1])/2;

                        }

                    }

                }

            }

            else

            {

                if (pos1==0)

                {

                    return (double)(nums2[pos2]+nums2[pos2-1])/2;

                }

                else if (pos2==0)

                {

                    return (double)(nums1[pos1]+nums1[pos1-1])/2;

                }

                else if(nums1[pos1-1]<=nums2[pos2-1])

                {

                    return (double)(nums1[pos1]+nums2[pos2-1])/2;

                }

                else

                {

                    return (double)(nums1[pos1]+nums1[pos1-1])/2;

                }

            }

        }

        else

        // 2a+1   a

        // 2b+1   b

        // a+b+1 a+b

        // nums2[pos2-1] == nums1[pos1]  nums2[pos2]

        // nums1[pos1]   nums2[pos2-1] ==   nums1[pos1+1]      nums2[pos2]

        // 1 2 3 4 5

        // 8 9 10 11 12

        {

            int pos1=nums1Size>>1;

            int pos2=nums2Size>>1;

            if (nums1[pos1]<nums2[pos2])

            {

                while (1)

                {

                    if (pos1==nums1Size-1)

                    {

                        if (pos2 == 0 || nums2[pos2-1]<nums1[pos1])

                        {

                            return (double)(nums2[pos2]+nums1[pos1])/2;

                        }

                        else

                        {

                            return (double)(nums2[pos2]+nums2[pos2-1])/2;

                        }

                    }

                    if (pos2==0)

                    {

                        if (nums1[pos1+1]<=nums2[0])

                        {

                            return (double)(nums1[pos1]+nums1[pos1+1])/2;

                        }

                        else

                        {

                            return (double)(nums1[pos1]+nums2[0])/2;

                        }

                    }

                    --pos2;

                    if (nums2[pos2]<=nums1[pos1])

                    {

                        if ( nums1[pos1+1]<=nums2[pos2+1])

                        {

                            return (double)(nums1[pos1+1]+nums1[pos1])/2;

                        }

                        else

                        {

                            return (double)(nums2[pos2+1]+nums1[pos1])/2;

                        }

                    }

                    //  nums1[pos1]  nums2[pos2-1] == nums1[pos1+1]  nums2[pos2]

                    //   2            3                5               4

                    ++pos1;

                    if (nums1[pos1]>=nums2[pos2])

                    {

                        if (nums1[pos1]>=nums2[pos2+1])

                        {

                            return (double)(nums2[pos2+1]+nums2[pos2])/2;

                        }

                        else

                        {

                            return (double)(nums1[pos1]+nums2[pos2])/2;

                        }

                    }

                }

            }

            else if (nums1[pos1]>nums2[pos2])

            {

                while (1)

                {

                    if (pos2==nums2Size-1)

                    {

                        if (pos1 == 0 || nums1[pos1-1]<nums2[pos2])

                        {

                            return (double)(nums1[pos1]+nums2[pos2])/2;

                        }

                        else

                        {

                            return (double)(nums1[pos1]+nums1[pos1-1])/2;

                        }

                    }

                    if (pos1==0)

                    {

                        if (nums2[pos2+1]<=nums1[0])

                        {

                            return (double)(nums2[pos2]+nums2[pos2+1])/2;

                        }

                        else

                        {

                            return (double)(nums2[pos2]+nums1[0])/2;

                        }

                    }

                    --pos1;

                    if (nums1[pos1]<=nums2[pos2])

                    {

                        if ( nums2[pos2+1]<=nums1[pos1+1])

                        {

                            return (double)(nums2[pos2+1]+nums2[pos2])/2;

                        }

                        else

                        {

                            return (double)(nums1[pos1+1]+nums2[pos2])/2;

                        }

                    }

                    ++pos2;

                    if (nums2[pos2]>=nums1[pos1])

                    {

                        if (nums2[pos2]>=nums1[pos1+1])

                        {

                            return (double)(nums1[pos1+1]+nums1[pos1])/2;

                        }

                        else

                        {

                            return (double)(nums2[pos2]+nums1[pos1])/2;

                        }

                    }

                }

            }

            else

            {

                return nums1[pos1];

            }

        }

    }

    else

    {

        // 2a       a   a+1

        // 2b+1     b

        //      nums1[pos1]   nums2[pos2-1]   nums1[pos1+1]   nums2[pos2]

        // 1 2 3 4 5

        // 6 7 8 9

        // 1 2 3

        // 4 5

        // 1 2 3 4

        // 5 6 7

        // 1 1 2 2 3

        // 4 5 6 7 8 9 10 11

        int pos1=nums1Size>>1;

        int pos2=nums2Size>>1;

        if (nums1[pos1]<nums2[pos2])

        {

            while (1)

            {

                if (pos1==nums1Size-1)

                {

                    if (pos2==0 || nums2[pos2-1]<nums1[pos1])

                    {

                        return nums1[pos1];

                    }

                    else

                    {

                        return nums2[pos2-1];

                    }

                }

                if (pos2==0)

                {

                    return nums1[pos1];

                }

                --pos2;

                if (nums2[pos2]<=nums1[pos1])

                {

                    return nums1[pos1];

                }

                ++pos1;

                if (nums1[pos1]>=nums2[pos2])

                {

                    return nums2[pos2];

                }

            }

        }

        else if (nums1[pos1]>nums2[pos2])

        {

            while (1)

            {

                if (pos2==nums2Size-1)

                {

                    if (pos1==0 || nums1[pos1-1]<nums2[pos2])

                    {

                        return nums2[pos2];

                    }

                    else

                    {

                        return nums1[pos1-1];

                    }

                }

                if (pos1==0)

                {

                    return nums2[pos2];

                }

                --pos1;

                if (nums1[pos1]<=nums2[pos2])

                {

                    return nums2[pos2];

                }

                ++pos2;

                if (nums2[pos2]>=nums1[pos1])

                {

                    return nums1[pos1];

                }

            }

        }

        else

        {

            return nums1[pos1];

        }

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值