算法思想是什么?
快速排序,个数是位数的象征,第k个数始终在个数多的那一边。
算法步骤是什么?
1.不管三七二十一先找个目标X分两边,此时X左边都<=X,右边>=X,也就能确定目标X在数列中的真实位置。
2.查看k是否<左边个数,如果小于说明在左侧内,左侧递归排序再找到K就OK,反之在右边。例:第三位要在第七位前面找。
3.最终无限夹击找到K。
算法代码是什么?
#include <iostream>
using namespace std;
const int N = 100010;
int q[N];
int quick_sort(int q[], int l, int r, int k)
{
if (l >= r) return q[l];
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
if (j - l + 1 >= k) return quick_sort(q, l, j, k);//如果左边的个数大于等于k,那就说明比k大的数在左边,递归
else return quick_sort(q, j + 1, r, k - (j - l + 1));//如果右边的个数大于等于k,那就说明比k大的数在右边,k也就变成k - (j - l + 1),反正一句话,跟随大的,个数是位数的象征
}
int main()
{
int n, k;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);
cout << quick_sort(q, 0, n - 1, k) << endl;
return 0;
}