寻找第K小元素——特定分治策略

1.问题
寻找数组中第K小的元素,使用分治策略算法完成。
2.解析
算法步骤:
1.将n个元素每 5 个一组,分成n/5(上界)组。
2.取出每一组的中位数,任意排序方法,比如插入排序。
3.递归的调用 selection 算法查找上一步中所有中位数的中位数,设为x,偶数个中位数的情况下设定为选取中间小的一个。
4.用x来分割数组,设小于等于x的个数为k,大于x的个数即为n-k。
5.若i==k,返回x;若i<k,在小于x的元素中递归查找第i小的元素;若i>k,在大于x的元素中递归查找第i-k 小的元素。
终止条件:n=1 时,返回的即是i小元素。
3.核心代码

int BFPRT(int a[], int l, int r, int id) //求数组a下标l到r中的第id个数
{
   
	if (r - l + 1 <= 5) //小于等于5个数,直接排序得到结果
	{
   
		insertionSort(a, l, r); return a[l + id - 1];
	}

	int t = l - 1; //当前替换到前面的中位数的下标
	for (int st = l, ed; (ed = st + 4) <= r; st += 5) //每5个进行处理
	{
   
		insertionSort(a, st, ed); //5个数的排序
		t++; swap(a[t], a[st+2]); //将中位数替换到数组前面,便于递归求取中位数的中位数
	}

	int pivotId = (l + t) >> 1; //l到t的中位数的下标,作为主元的下标
	BFPRT(a, l, t, pivotId-l+1);//不关心中位数的值,保证中位数在正确的位置
	int m = partition(a, l, r, pivotId), cur = m - l + 1;
    if (id == cur) return a[m];                   //刚好是第id个数
    else if(id < cur) return BFPRT(a, l, m-1, id);//第id个数在左边
    else return BFPRT(a, m+1, r, id-cur);         //第id个数在右边
}

4.分析
在这里插入图片描述

5.完整代码

#include <iostream>  
#include <string.h>  
#include <stdio.h>  
#include <time.h>  
#include <algorithm>  
   
using namespace std;  
const int N = 1000005;  
   
int a[N];  


int findMedian(int a[] , int l , int r)
{
   
    int i , index;
    for(i=l,index=
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值