数据结构-二路归并-练习题1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cyzyfs/article/details/78158556

题目

1.一个长度为L(L≥1)的升序序列S,处在个位置的数为S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是15,。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现有两个等长升序序列A和B,试设计一个时间和空间两方面尽可能高效的算法,找出两个序列A和B的中位数。

代码实现 (时间复杂度 log2(n))

#include <stdio.h>

int getArrMid(int a[],int b[],int s1,int e1,int s2,int e2){
    int m1=(s1+e1)/2;
    int m2=(s2+e2)/2;
    if(a[m2]==b[m1]){
        return a[m1];
    }
    else if(s1==m1){
        return (a[m1]>b[m2]?a[m1]:b[m2]);
    }
    else if(a[m1]<b[m2]){
        return getArrMid(a,b,m1+1,e1,s2,m2-1);
    }
    else if(a[m1]>b[m2]){
        return getArrMid(a,b,s1,m1-1,m2+1,s2);
    }
}

int main(){
    int a[]={7,6,5,4,3};
    int b[]={20,4,3,2,1};
    int i=getArrMid(a,b,0,4,0,4);
    printf("a_b_Mid=%d",i);
}

结果

结果

代码实现(错误示范 时间复杂度 nlog2(n)

/*
 *
 * 第一题
 *
 *
 * */

#include <stdio.h>

int main() {

/*
 *
 * 二路归并 之 有序数组合并
 *
 * a={11,13,15,17,19}
 * b={2,4,6,8,20}
 * c=a+b={11,13,15,17,19,2,4,6,8,20}
 * 对c数组进行排序
 *
 *
 * */
    int c[10]={2,4,6,8,20,11,13,15,17,19};

    //准备工作
    int L=0,R=5;//左起始点  右起始点
    int RightEnd=9;//右终止点
    int LeftEnd=R-1;//左终止点
    int NumElements=RightEnd-L-1;//元素总数
    int Tmp=0;//临时数组指针
    int TmpA[10];//临时数组

    //合并
    while(L<=LeftEnd&&R<=RightEnd){
        if (c[L]<=c[R]) TmpA[Tmp++]=c[L++];
        else TmpA[Tmp++]=c[R++];
    }
    while (L<=LeftEnd){
        TmpA[Tmp++]=c[L++];
    }
    while (R<=LeftEnd){
        TmpA[Tmp++]=c[R++];
    }

    //TmpA-->c
    for(int i=0;i<NumElements;i++,RightEnd--){
        c[RightEnd]=TmpA[RightEnd];
    }

    //显示结果
    printf("归并排序结果:");
    for(int i=0;i<10;i++){
        printf("%d\t",c[i]);
    }
    printf("中位数:%f", (c[4]+c[5])/2.0);
    return 0;
}

结果

这里写图片描述

猜你喜欢

转载自blog.csdn.net/cyzyfs/article/details/78158556