题目描述
给定n(1<=n<=1000000)个元素,求第k小数(1<=k<=n)。
输入
一组样例。第一行输入两个整数n和k。第二行输入n个不同的int范围内的数。
输出
输出一行,输出第k小数。
样例输入
5 2
1 5 3 2 4
样例输出
2
#include <iostream>
using namespace std;
void Qsort(int arr[], int low, int high, int k){
int i = low; //快速排序
int j = high+1;
int key = arr[low];
while (true)
{
while (arr[++i] < key){
if (i == high)
break;
}
while (arr[--j] > key){
if (j == low)
break;
}
if (i >= j) break;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
int temp = arr[low];
arr[low] = arr[j];
arr[j] = temp;
if(j==(k-1)){ //j是当前基准元素的下标 它等于k的下标 即找到第k小的数了
cout<< arr[k-1]<<endl;
return ;
}
if(j<(k-1)){ //j小于k下标 说明k会出现在右子列 只对右子列进行操作
Qsort(arr, j + 1, high,k);
}
else{ //j大于k下标 说明k会出现在左子列 只对左子列进行操作
Qsort(arr, low, j - 1,k);
}
}
int main(){
int n,k;
cin >> n >> k;
int nums[n];
for(int i=0;i<n;i++)
cin >> nums[i];
Qsort(nums, 0, n-1,k);
return 0;
}
学校的OJ上这题单纯用快排把数组排好再求第k个数也能AC 但是上课老师讲到分治讲到这个问题的时候用的方法是每次只看一个子列不管另一个k不会出现的子列 想试着写出来 写了一天终于写出来了 菜鸡哭泣
最大的问题就是一直在k应该是相对下标还是绝对下标那里搞不清楚 上课的时候老师特别强调k是相对low的 我就一直往相对下标的方向设参数 但是输出不对 仔细看看了想了想发现不一定要相对下标 这里一直是在原数组上操作没改变数组大小 用绝对下标就行