求第k小数
时限:1000ms 内存限制:10000K 总时限:3000ms
问题描述:
输入一组无序数列,求第k小数
输入:
先输入一个小于10000的正整数n,再输入n个整数,最后输入一个小于等于n的正整数k
输出:
输出其中第k小的数。
输入示例
输出示例
基本思路
假设无序序列存放在a[0…n-1]当中,若将a递增排序,则第K小的元素就是a[k-1],采用类似快速排序的思想。
具体过程
(1)若left≥right,即其中没有元素或者只有一个元素,如果left=right,且left=k-1,表示只有一个元素且a[k-1]就是要求的结果,返回a[k-1];
(2)若left<right,表示该序列中有两个或两个以上的元素,以基准为中心将其划分为a[left…i-1]和a[i+1…right]两个子序列,基准a[i]已归为,a[left…i-1]中的元素都小于a[i],a[i+1…right]中的元素都大于a[i],也就是说a[i]是序列中的第i+1小的元素,有3种情况:
①若k-1=i,则a[i]即为所求,返回a[i];
②若k-1<i,第K小的元素应该在a[left…i-1]的子序列中,递归在该序列中求解并返回其结果;
③若k-1>i,第K小的元素应该在a[i+1…right]的子序列中,递归在该序列中求解并返回其结果;
代码实现
//求解第K小数
#include <iostream>
using namespace std;
int n;
int a[100000];
int k;
int QuickSelect(int a[],int left,int right,int k);
int main()
{
int answer;
scanf("%d",&n);
for