找数组中第k小元素

问题描述:求数组中第n小元素(第二小或者第二大的元素)

若求第二小有以下思路:

  1. 遍历一遍数组,找到最小元素。将其置为无穷大,再遍历一遍数组。
  2. 找到数组中最小值后,将其它元素存放在另一数组中,再遍历一遍求最小值。
  3. 设置first,second. 初始时分别等于min(a[0],a[1])与max(a[0],a[1]).然后从下标2开始遍历
    如果比first小,更新fiirst.
    如果比first大,比second小更新second
    返回second

第k小算法思想:利用快排+递归

一次快排(每次排序确定基准元素的位置)后将确定了位置的元素的下标i与我们要查找的k进行比较.

  1. 如果i==k-1;则是我们要找的第k小的元素
  2. 如果i>k-1;则递归地在[s,i-1]区间进行查找
  3. 如果i<k-1;则递归地在[i+1,l]区间进行查找

输入:

数组大小: 6
数组:8,4,6,7,3,5

找第k小:2

输出:

4

解决方案:

#include"iostream"
#include"vector"
using namespace std;
int quicksort(int a[], int s, int l, int k)
{
	int i = s;int j = l;int temp = a[s];
	if (s < l)
	{
		//快排
		while (i != j)
		{
			while (i < j&& a[j] > =temp)j--;
			a[i] = a[j];
			while (i < j&& a[i] < =temp)i++;
			a[j] = a[i];
		}
		a[i] = temp;//temp最终位置

		if (k - 1 == i)return a[i];
		else if (k - 1 < i)return quicksort(a, s, i - 1, k);
		else return quicksort(a, i + 1, l, k);//注意k代表的是k-1下标的那个元素哦
	}
	else if (s == l && s == k - 1)
		return a[k - 1];
	else 
		return -1;
}
int main()
{
	int i = 0;int k;int n;
	cin >> n;
	int a[100];
	for (i = 0;i<n;i++)
	{
		cin >> a[i];
	}
	cin >> k;
	cout << quicksort(a,0,n-1,k)<< endl;
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值