归并排序改进版查找两序列A和B的中位数

归并排序改进版查找两序列A和B的中位数

题目来源:数据结构王道考研辅导书线性表顺序表示大题第11题(2011统考真题)
题目描述:在这里插入图片描述

说明
非最优代码,答案上面的最优代码我有点理解不了,考场上我也绝对不可能想到答案上面的方法,所以我去听了王道课后习题视频讲解,这老师讲的是真的好,唯有感谢,老师给出了三种思路,但没给出具体实现代码,我选了一个较好的方法,自己实现了一下,如果有不妥或者代码冗余的地方,还请各位大佬指正,感谢各位大佬。
这是视频讲解的总结
在这里插入图片描述
算法思路:
想必大多数人首先想到的就是先归并排序,然后再找出第⌈L/2⌉个位置的元素即可,很好,但是我们可以再进一步,因为归并排序要用到一个辅助数组,空间复杂度为O(n),我们可以利用归并排序的思想,也就是排序,但是不进行合并为一个数组,问题就转化为了我们找两个数组中第⌈L/2⌉小的元素,看到这,想必朋友你已经大概了解了思路,下面是代码实现。

代码实现

#include<stdio.h>
int FindMedian(int A[],int B[],int n,int m){//n为数组A的长度,m为数组B的长度 
	/*pos为第⌈L/2⌉个位置
	count用来计数,表示有没有到达第⌈L/2⌉个位置
	 */ 
	int i = 0,j = 0,count = 0,pos,temp;
	/*判断⌈L/2⌉具体在哪个位置*/
	if((n + m)%2 == 0){//A、B合并的数组的长度为偶数,注意,两数组并未合并
		pos = (n + m)/2;
	} 
	else{//A、B合并的数组的长度为奇数 
		pos = (n + m)/2 + 1;
	}
	//归并排序的思想,找第⌈L/2⌉个位置
	while(i < n && j < m){
		if(A[i] <= B[j]){//"="表示若数组A,B中有相同的元素,默认取数组A中的元素排在前面 
			count++;
			if(count == pos){//找到第⌈L/2⌉个位置
				temp = A[i];
				break;
			}
			i++;	
		}
		else{
			count++;
			if(count == pos){//找到第⌈L/2⌉个位置
				temp = B[j];
				break;
			}
			j++;		
		}
	} 
	/*下面是两个有序数组有一个已经排完了,只需要在另一个数组中找第⌈L/2⌉个位置即可,下面两个循环只会执行一个*/
	while(i < n){
		count++;
		if(count == pos){
			temp = A[i];
			break;
		}
		i++;	
	}
	while(j < m){
		count++;
		if(count == pos){
			temp = B[j];
			break;
		}
		j++;
	}
	return temp;
}
int main(){
	/*用题目中给出的两个数组测试一下
	我测试了几个数组,结果都没什么问题,但是不代表我的代码就没问题了
	毕竟样本太少,希望大佬可以指正,谢谢各位大佬
	*/
	int A[5] = {11,13,15,17,19};
	int B[5] = {2,4,6,8,20};
	printf("%d",FindMedian(A,B,5,5));
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值