进阶实验1-3.1 两个有序序列的中位数 (25分)

 

 

 

 解题思路:

先比较a数组的中位数a[mid]和b数组的中位数b[mid],如果a[mid]=b[mid],则直接输出;否则,

    1)、数组长度为奇数时,

            如果a[mid]>b[mid],则丢掉a[mid](不含a[mid])右边的数,和b[mid](不含b[mid])左边的数

            如果a[mid]<b[mid],则丢掉a[mid](不含a[mid])左边的数,和b[mid](不含b[mid])右边的数

    2)、数组长度为偶数时

            如果a[mid]>b[mid],则丢掉a[mid](不含a[mid])右边的数,和b[mid](含b[mid])左边的数

            如果a[mid]<b[mid],则丢掉a[mid](含a[mid])左边的数,和b[mid](不含b[mid])右边的数

如此循环,直至两个数组均只剩下一个数,较小者则为所求

 

#include <stdio.h>
int main() {
    int n;
    scanf("%d",&n);
    int a[n],b[n];
    int i;
    for(i=0; i<n; i++) {
        scanf("%d",&a[i]);
    }
    for(i=0; i<n; i++) {
        scanf("%d",&b[i]);
    }
    int i1=0,i2=0,j1=n-1,j2=n-1,mid1=(i1+j1)/2,mid2=(i2+j2)/2;
    while(i1<j1) {
        if(a[mid1]==b[mid2])
            break;
        if((i1+j1+1)%2==0) {
            if(a[mid1]>b[mid2]) {
                j1=mid1;
                i2=mid2+1;
            } else if(a[mid1]<b[mid2]) {
                i1=mid1+1;
                j2=mid2;
            }
        } else {
            if(a[mid1]>b[mid2]) {
                j1=mid1;
                i2=mid2;
            } else if(a[mid1]<b[mid2]) {
                i1=mid1;
                j2=mid2;
            }
        }
        mid1=(i1+j1)/2;
        mid2=(i2+j2)/2;
    }
    printf("%d",a[mid1]<b[mid2]?a[mid1]:b[mid2]);
   return 0; }

 

posted @ 2020-03-07 17:07  跃鱼  阅读(860)  评论(0编辑  收藏  举报