找数组中第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

输入:

数组大小: 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;
}

运行结果

找数组中第k小元素_第1张图片

你可能感兴趣的:(数据结构,leetcode,算法)