算法分析与实践-作业6-分治法求第k小的数

1. 问题

使用分治法求第k小的数

2. 解析

在这里插入图片描述

3.设计

int select(int num[], int p, int r, int k) {
	//当前数组长度
	int len = r - p + 1;
	//判断长度是否小于5,小于5直接排序求第k小的数
	if (len <= 5) {
		qsort(num, len, sizeof(int), cmp);
		return num[k - 1];
	}
	else {
		//将数组分为group组,每组5个数
		int group = len / 5;
		int i;
		//将数组剩余的数赋值给m
		int m = len - group * 5;
		//每个group组进行快速排序
		for (i = 0; i < group; i++) {
			qsort(num + i * 5, 5, sizeof(int), cmp);
			//排序后,把每个group组的中间值放在mid中
			mid[i] = num[i * 5 + 2];
		}
		//若分完group组有剩余,将剩余的数进行排序
		if (m > 0) {
			qsort(num + group * 5, m, sizeof(int), cmp);
			//将中间值赋值给mid
			mid[group] = num[group * 5 + m / 2];
			//group+1
			group++;
		}
		//对mid数组排序,找出中间值赋值给mm
		qsort(mid, group, sizeof(int), cmp);
		int mm = mid[group / 2];mm(整个数组最中间的值)把数组分为s1和s2
		for (int i = p-1; i < r; ++i) {
			比mm小的数放在s1,比mm大的数放在s2
		}
		int f = 0;
		//如果k的值==len_s1+1,说明mm就是第k小的数
		if (k == len_s1 + 1) {
		}
		else if (k <= len_s1) {
			//如果k<=len_s1,说明第k小的数在s1,递归调用select函数
		}
		else {
			//如果k>len_s1,说明第k小的数在s2,递归调用select函数
		}
		return f;
	}
}
int main() {
	//输入示例
	int n[NUM] = { 13,12,11,14,15,7,9,14,16,18,2,4,6,8,10,1,3,5,7,9,2,3};
	printf("%d\n", select(n, 1, 22, 10));
	return 0;
}

4. 分析

W ( n ) = O ( n ) W(n)=O(n) W(n)=O(n)

5. 源码

https://github.com/QAQnoname/homework/blob/master/%E4%BD%9C%E4%B8%9A6/%E5%88%86%E6%B2%BB%E6%B3%95%E6%B1%82%E7%AC%ACk%E5%B0%8F%E7%9A%84%E6%95%B0.cpp

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值