线性时间选择

本文探讨了在最坏情况下用线性时间复杂度解决选择问题的算法。通过模仿快速排序并寻找合适的划分基准,确保子数组至少缩短一定比例,从而达到O(n)的时间复杂度。介绍了将元素划分为每组5个并找出中位数,再递归找到这些中位数的中位数作为基准,确保子数组长度至少缩短1/4的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定n个元素和1个k,1<=k<=n,要求找出这n个元素中第k小的元素。

下面讨论解一般的选择问题的分冶算法,实际是模仿快速排序算法,不同的是,只对划分出的子数组之一进行递归处理。


#include <iostream>
#include <stdio.h>
#include <time.h>
using namespace std;

int randomSelect(int a[], int p, int r, int k);

int randomPartition(int a[], int p, int r);

int myPartition(int a[], int p, int r);

int main()
{
	int a[10] = {5, 8, 50, 47, 63, 12, 30, 19, 9, 25};
	int m = randomSelect(a, 0, 9, 5);
	cout << m;
}

int randomSelect(int a[], int p, int r, int k){
	if(p == r) return a[p];
	int i = randomPartition(a, p, r);
	int j = i - p + 1;
	if(k <= j) return randomSelect(a, p, i, k);
	else return randomSelect(a, i + 1, r, k - j);
}

int randomPartition(int a[], int p, int r){
	srand(time(0));
	int i = p + rand() % (r - p + 1);
	int temp = a[i];
	a[i] = a[p];
	a[p] = temp;
	return myPartition(a, p, r);
}

int myPartition(int a[], int p, int r){
	int i = p, j = r + 1;
	int x = a[p];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值