算法:O(n)时间内在数组中找到第k个小的数

本文介绍了如何在O(20n)的时间复杂度内解决k-select问题,即从无序数组中找到第k小的数。中位数和第二大数的查找作为此问题的特例被提及。代码实现读取输入数组的大小n和位置k,然后输出第k小的数。
摘要由CSDN通过智能技术生成

从一个长度为n的无序数组中,找到第k小的那个数,被称为k-select问题。我们经常见到的问题:找到中位数,找到第二个大的数,都是这个问题的特例。

算法的复杂度是O(20n),当选择为5个数为一个小集合时。

OJ风格的完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

#define Q 5
#define LOCAL

int A[1001];
int n;
int k;


int cmp(const void *a, const void *b) {
	return *(int *)a - *(int *)b;
}

int trivivalSelect(int *A, int n, int k) {
	int temp[1001];
	memset(temp, 0, sizeof(int)*1001);
	memmove(temp, A, sizeof(int)*n);
	qsort(temp, n, sizeof(int), cmp);
	printf("trivivalSelect: %d\n", temp[k]);
	return temp[k];
}


int kselect(int* A, int n, int k) {
	if (n < Q) {
		return trivivalSelect(A, n, k);
	}
	int mid[1001];
	int temp[1001];
	memset(mid, 0, sizeof(int)*1001);


	
	int i = 0;
	int c = 0;
	while (i < n) {
		int count = (n - i < Q ? n - i : Q);
		memset(temp, 0, sizeof(int)*1001);
		memmov
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值