第九届蓝桥杯第五题:快速排序

该博客介绍了快速排序算法的一个实现示例,详细讲解了如何找到数组中的第k个最小值。通过随机选取基准元素并进行分区操作,递归地处理左右子数组来达到排序目的。在代码中,当基准线等于第k个最小值时,返回基准值;如果基准线小于第k个最小值,则在右侧子数组中寻找;否则在左侧子数组中寻找。
摘要由CSDN通过智能技术生成

快速排序介绍

快速排序解释

题目

#include <stdio.h>

int quick_select(int a[], int l, int r, int k) {
	int p = rand() % (r - l + 1) + l;
	int x = a[p];
	{int t = a[p]; a[p] = a[r]; a[r] = t;}
	int i = l, j = r;
	while(i < j) {
		while(i < j && a[i] < x) i++;
		if(i < j) {
			a[j] = a[i];
			j--;
		}
		while(i < j && a[j] > x) j--;
		if(i < j) {
			a[i] = a[j];
			i++;
		}
	}
	a[i] = x;
	p = i;
	if(i - l + 1 == k) return a[i];
	if(i - l + 1 < k) return quick_select( _____________________________ ); //填空
	else return quick_select(a, l, i - 1, k);
}
	
int main()
{
	int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
	printf("%d\n", quick_select(a, 0, 14, 5));
	return 0;
}

说明

根据快速排序和题目的说明
if(i-l+1==k)就是基准线为第k个最小值的情况
if (i - l + 1 < k)就是基准线小于第k个最小值,也就是说整个数组第k最小值在基准线右边没有分类的大数里面
else 就是说基准线大于第k个最小值,也就是说整个数组第k最小值在基准线左边没有分类的小数里面

然后由此可得前几个参数为 a,i+1,r,
根据快速排序的原理基准线左边的数一定小于右边的数,所以整个组数中第k个最小值在当前基准线的右部分,而前面k-1个(下标i+1个)最小值在右边,所以对于右边这个子数组而言,整个数组的第k个最小值,应当是其第k-(i-l+1)个最小值。

答案:a, i+1, r, k-(i-l+1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值