数据结构-二路归并-练习题1
2017-10-04 16:38
225 查看
题目
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; }
结果
相关文章推荐
- 数据结构-二路归并及归并排序
- 数据结构--二路归并
- 数据结构-数组排序-二路归并-循环实现-C语言
- 数据结构-二路归并-递归实现-C语言
- uoj #228. 基础数据结构练习题
- 自己动手实现数据结构——排序算法1(冒泡、插入、归并、简单选择)(C++实现)
- 二路归并非递归排序Java实现
- 数据结构排序3--归并排序
- 数据结构 26 排序 归并 快排使用精简栈深度优化
- 数据结构练习题---合并表 (顺序表)
- 二路归并算法
- 数据结构啊----基础知识练习题.
- 二路归并算法的实现
- 数据结构-链表-练习题1
- 二路归并c++完整版,可运行
- 2-10-归并扩展的线性单链表-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版
- 数据结构:外排序-多路归并
- [UOJ#228]基础数据结构练习题
- 数据结构 27 排序 排序-选择 插入 冒泡 希尔 快速归并 6种排序
- (TOJ1215)数据结构练习题——合并表