使用快排思想在N个数里选出第K大的数

本博客分享了一次失败的字节跳动面试经历,面试官建议加强编码实践。作者选择了《数据结构与算法分析C++语言描述》一书进行自我提升,并分享了书中1.1章节关于选择问题的代码实现,即在一个数组中找到第K大的元素。代码使用了C++语言,通过递归和快速排序的思想实现了这一功能。

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

第一篇博客,起因是找实习,但是太菜了,本科和研究生期间编码量太少,在字节面试手撕代码环节非常痛苦,也没撕出来,但是面试官非常好,给我了建议,让我先敲数据结构书的课后题。
我选的数据结构书是数据结构与算法分析 C++语言描述 Mark那版。
下面是1.1 编写一个程序解决选择问题。还不太会算时间复杂度,时间复杂度先空着……

//1.1 编写程序解决选择问题,就是在N个数里面选第K个最大的数。
#include<iostream>
#include<vector>
#include <cassert>
int partition(std::vector<int>& arr, int K, int left, int right)
{
	int i = left;
	int j = right;
	int mid = left + (right - left) / 2;
	assert(K <= right && K >= left);
	//用了一个三数取中
	if (arr[i] > arr[j]) std::swap(arr[i], arr[j]);
	if (arr[mid] > arr[j]) std::swap(arr[mid], arr[j]);
	if (arr[i] < arr[mid]) std::swap(arr[i], arr[mid]);
	int pivot = arr[i];
	while (j != i)
	{
		while (j > i && arr[j] >= pivot) j--;
		while (j > i && arr[i] <= pivot) i++;
		if (j > i)
			std::swap(arr[i], arr[j]);
	}
	std::swap(arr[i], arr[left]);
	if (i == K) //找到了就返回
	{
		return arr[i];
	}
	else if (i < K)
	{
		return partition(arr, K, i + 1, right); 
	}
	else if (i > K)
	{
		return partition(arr, K, left, i - 1);
	}
}
int main()
{
	std::vector<int>arr{ 1,5,6,3,2,9 };
	int len = arr.size();
	int K = 6;
	int res = partition(arr, len - K, 0, len - 1);
	std::cout << res << std::endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值