基于问题分解的中位数寻找

目录:

  • 题目
  • 解题思路
  • 解题方法



 - 题目
 从N个无序的数字(即数列S)中,寻找中位数(这里的中位数指>=N/2 的最小整数)
 - 解题思路
1.取S中任意一个数字作为基准(x)判断,循环将集合S分解为两个子集S1,S2(S1为大于x的集合,S2为小于x的集合)
2.设|S|表示集合S中元素个数,设n为>=N/2的最小整数
情况一:|S2|>=n,表示中位数在S2中
情况二:|S2|=n-1,表示中位数就是基准x
情况三:|S2|<n-1,表示中位数在S1中
思路表明:可以用递归实现
1.设置函数MiddleN(int list[], n);为寻找第n个数字
2.结束条件:当且仅当找到数字
3.等价关系式子:就是三种情况

int MidddleN(int list[], int n, int lenth) {
	//将list[]分为两个集合,记录数目
	int S1[100], S2[100]; //要足够大到可以存储list一半以上的元素
	int sum1 = 0, sum2 = 0;
	int i = 0;
	int e = list[0];
	//将数组分成S1,S2
	for (i = 0; i < lenth; i++) {
		if (list[i] > e) {
			S1[sum1++] = list[i];	
		}
		else if (list[i] < e) {
			S2[sum2++] = list[i];
		}
	}

	//等价条件+结束条件

	if (sum2 >= n) {
		MidddleN(S2, n, sum2);
	}
	else if (sum2 < n - 1) {
		MidddleN(S1, n - sum2 - 1, sum1);
	}
	else {
		return e;
	}
}

递归真的很有效!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值