问题描述:求数组中第n小元素(第二小或者第二大的元素)
若求第二小有以下思路:
- 遍历一遍数组,找到最小元素。将其置为无穷大,再遍历一遍数组。
- 找到数组中最小值后,将其它元素存放在另一数组中,再遍历一遍求最小值。
- 设置first,second. 初始时分别等于min(a[0],a[1])与max(a[0],a[1]).然后从下标2开始遍历
如果比first小,更新fiirst.
如果比first大,比second小更新second
返回second
第k小算法思想:利用快排+递归
一次快排(每次排序确定基准元素的位置)后将确定了位置的元素的下标i与我们要查找的k进行比较.
- 如果i==k-1;则是我们要找的第k小的元素
- 如果i>k-1;则递归地在[s,i-1]区间进行查找
- 如果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;
}