進階實驗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; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM