SDUTOJ-4166-第k小的数,起初用的sort,直接WA;然后又用快排做了一遍,TLE;比较了以下快排和希尔,从csdn上看到可以用key来优化以下快排,试了一下,过了。
Description
现有一个包含n个整数(1<=n<=900000)的无序序列(保证序列内元素各不相同),输入一个整数k(1<=k<=n),请用较快的方式找出该序列的第k小数并输出。
Time Limit:5000 ms
Mem. Limit:65536 KiB
Input
第一行先输入两个整数,n和k。
接下来是一行输入n个由空格分开的互不相同的整数num(1<=num<=90000000)。
Output
输出该组数据中第k小的数num。
SAMPLES
input
6 4
3 2 5 1 4 6
output
4解题过程
思路:(主要是面向结果)在原来快排的基础上,在快排的最后增加一个比较环节,就是比较以下key值和寻找的k值的大小,若k值小于key值,则不需要对后半段进行排序。
代码实现
#include<bits/stdc++.h>
using namespace std;
int n;
int a[1000001];
int k;
void qsort(int l,int r)
{
int mid=a[(l+r)/2];
int i=l,j=r;
do{
while(a[i]<mid)i++;
while(a[j]>mid)j--;
if(i<=j)
{
swap(a[i],a[j]);
i++;
j--;
}
}while(i<=j);
if(l<j)
qsort(l,j);//搜索左半部分
if(j<r&&k>=j)
qsort(i,r);//搜索右半部分
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
qsort(1,n);
cout<<a[k];
}
总结
针对这个题,可以考虑只排好前k个数即可,需要比较以下key值和k值。