一 概述
刚开始敲代码没多久,第一次输出请多指教,期待相互学习。
二 目录
三 正文
1 问题
两个等长的升序数组,找它排序后的中位数,中位数这里定义为元素个数除以2取上界,要求较好的时间按复杂度与空间复杂度。
2 分析与思想
自己发现问题里的要素都还看不懂,于是先去了解了所有的要素:数组,发现又得学很多c语言基础,然后都学了一遍,又搜了时间复杂度,空间复杂度发现是数据结构里面的,然后用去找了本数据结构,看了第一节,目录里面发现恰好有排序,然后又买了本数据节后好好学了一遍,学了很久,才回头来写这个问题。
然而自己还是只想到先利用merge-sort排序,之后再查找,看了答案复杂度更小,用的是分别找中位数,然后处理新的剩余数组,自己也没证明出那就是中位数,但代码写了出来。
3 模块
就是一个定义数组与长度,一个查找函数负责找中位数。
4 函数
查找函数与主函数,库函数。
5 代码
逻辑到数据处理的映射,基本的数据及其处理,语言的表达,循环与条件等相关基本要素的组织。
#include <stdio.h> //链接库,有的函数在库里面,再底层就是让os提供相关功能。
int main()//主函数
{
int Mid_Search(int a[],int b[],int n);//定义查找函数,传入的参数有两个数组与数组长度
int m,n=5; //数组长度
int a[5]={1,2,3,6,7}; //定义并初始化a数组
int b[5]={4,5,8,9,10};//b数组
m=Mid_Search(a,b,n);//让m等于函数处理后的返回值,逻辑上也可以叫数传入函数后输出的值,在这里具体化后就是我们要找的中值
printf("%d",m);//输出返回值
return 0;//暂时接受不做解释
}
int Mid_Search(int a[],int b[],int n)//开始写这个函数具体怎么处理输入的参数来得到最终的输出,
{
int s1,m1,d1=n-1;//用数组在处理所存的数,位序与下标对应好 ,这里定义的变量是为了标识我们待处理的数组,按照思想这个待处理数列不断变化。
int s2,m2,d2=n-1;//同上
while(s1!=d1||s2!=d2)//为什么要循环,是因为某个操作要反复进行,这里的操作是对数组的中位数的查找和对比和得到新要处理的数组要反复进行,
//这里提一句这个循环前一个与后一个常常是有联系的,那么之后碰到这种就可以注意,循环也是应该终止的,什么时候,根据思想那个直到,应该是只剩一个数的时候。
//再补充一个,此处也明显是应该可以用递归解决的,符合递归的要素,但是没用,主要是为了良好的空间复杂度。
{
m1=(s1+d1)/2;//中位数,自己可以在纸上写一下看是不是确实是的,注意数组的下标。
m2=(s2+d2)/2;//
if(a[m1]==b[m2])//对应思想里面的第一种情况,这里数据处理与问题映射还是很直接的。
return a[m1];//
else if(a[m1]<b[m2])//对应思想里面的第一种情况,如果出现的是数组b的中位数更大则是一种情况,只要情况不同就可能出现分类。
{
if((s1+d1)%2==0)//偶数个与奇数个数列所进行的舍弃也是不一样的,思想说的是舍弃一半,具体就得看偶数和奇数分别怎么舍,这里可能出现到底是否保留中间节点,自己可以纸上试一下。
{
s1=m1;
d2=m2;
}
else
{
s1=m1+1; //得到待处理的新数组,供下次循环用。
d2=m2;
}
}
else //其实就是a与b反过来。
{
if((s2+d2)%2==0)
{
s2=m2;
d1=m1;
}
else
{
s2=m2+1;
d1=m1;
}
}
}
return a[s1]<b[s2]? a[s1]:b[s2]; //此处就是语言的规定你了,规定了这样一个表示的意思是为真则前,为假则后。
}