【算法概论】分治算法:查找中位数

线性时间查找数组中位数:分治算法实践
本文介绍了如何使用分治算法在长度为n的整型数组中寻找中位数。通过以数组中间位置的元素作为基准值进行划分,将数组分为小于、等于和大于基准值的三部分,再根据各部分元素数量确定中位数所在的位置,从而实现在线性时间内找到中位数的目标。

1、问题描述:

对于长度为n的整型数组A,随机生成其数组元素值,然后实现一个线性时间的算法,在该数组中查找其中位数。

2、算法描述:

以原数组中位于中间位置k的元素作为基准值pivot,对原数组进行划分,分别为元素值< pivot、= pivot和> pivot的三部分,将这三部分的元素值分别赋给数组SL、SV、SR,并计算出SL、SV、SR中有效元素的个数sl、sv、sr。将k和sl、sv+sl、sl+sv+sr比较,如果k < sl,说明该数组的中项在SL数组中;如果k < sl+sv,说明该数组的中项在SV中;如果k < sl+sv+sr,说明该数组的中项在SR中。

/*
对于长度为n的整型数组A,随机生成其数组元素值,然后实现一个线性时间的算法,在该数组中查找其中项。
*/

#include <iostream>
#include <stdlib.h>

using namespace std;

int selection(int data[], int n, int k);

int main()
{
	int data[9];
	int n = 9;

	//随机生成数组元素值
	for (int i = 0; i < n; ++i)
	{
		data[i] = rand();
		cout << data[i] << ' ';
	}
	cout << endl;

	if (n & 1)	//如果有奇数个元素
	{
		cout << selection(data, n, n / 2) << endl;
	}
	else    //如果有偶数
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值