分治法求第k小元素

算法:http://www.cnblogs.com/chaofan/archive/2009/12/14/1623320.html

求一列数中的第k小元素,利用分治的策略进行递归求解。

首先随便指定一个数,这里我指定的是第一个数为第k小元素记为randK,将数组中其他的数与findK进行比较,比他小的放在左边,大的放在右边,如果randK左边的元素个数为k-1个,说明findK就是你所要找的元素,如果左边的元素个数>k-1,说明你要找的元素在左边的数中,继续使用相同的方法在左边的数中进行查找,如果左边的元素的个数<k-1,说明你要找的元素在右边的数中,则继续使用相同的办法在右边的数中进行查找。。。

代码:

#include <iostream>
using namespace std;

const int M = 999;
typedef struct Data 
{
	int data;
	bool flag;
}Mit[M];

int findP(int a [], int oP, int R)
{
	int randK = a[oP];
	int iL = oP + 1;
	int iR = R;
	while (true)
	{
		while (a[iL] < randK)
		{
			iL++;
		}
		while (a[iR] >= randK)
		{
			iR--;
		}
		if (iL >= iR)
		{
			break;
		}
		swap(a[iL], a[iR]);
	}
	swap(a[oP], a[iR]);
	return iR;
}

int findK(int a [], int oP, int n, int k)
{
	int find_k;
	int copy_k;
	find_k = findP(a, oP, n);
	copy_k = find_k - oP;
	if (k == copy_k)
	{
		return a[find_k];
	}
	if (k > copy_k)
	{
		return findK(a, find_k + 1, n, k - copy_k - 1);
	}
	if (k > copy_k)
	{
		return findK(a, oP, find_k - 1, k);
	}
	else
	{
		return 0;
	}
}

int main()
{
	int n;
	int k1, k2;
	Mit d;
	cout << "请输入无序列表的大小:" << endl;
	cin >> n;

	cout << "请输入无序列表中的所有元素" << endl;
	//输入无序列表中的所有元素
	for (int i = 0; i < n; i++)
	{
		d[i].flag = 1;
		cin >> d[i].data;
	}

	cout << "请输入k1, k2:" << endl;
	cin >> k1 >> k2;
	if (k1 < k2)
	{
		int temp = k1;
		k1 = k2;
		k2 = temp;
	}

	for (int i = 0; i < n; i++)
	{
		if (d[i].flag)
		{
			cout << d[i].data << endl;
		}
	}

	system("pause");
}

 

/*****************
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值