786. 第k个数

 

题目描述

给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少。


输入格式
第一行包含两个整数 n 和 k。

第二行包含 n 个整数(所有整数均在1~109范围内),表示整数数列。


输出格式
输出一个整数,表示数列的第k小数。


数据范围
1≤n≤100000, 1≤k≤n

输入样例:
5 3
2 4 1 5 3

输出样例:
3

思路

①C++STL无敌

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 using namespace std;
 6 const int max_n=1e5+5;
 7 int a[max_n];
 8 
 9 int main() {
10     int n, k;
11     cin>>n>>k;
12     for(int i=0; i<n; i++) cin>>a[i];
13     sort(a, a+n);
14     cout<<a[k-1]<<endl;
15     return 0;
16 }

②手打快排

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 using namespace std;
 6 const int max_n=1e5+5;
 7 int a[max_n];
 8 
 9 void quickSort(int l, int r) {
10     if(l>=r) return;
11     int i=l-1, j=r+1, x=a[l+r >> 1];
12     while(i<j) {
13         do i++; while(a[i]<x);
14         do j--; while(a[j]>x);
15         if(i<j) swap(a[i], a[j]);
16     }
17     quickSort(l, j);
18     quickSort(j+1, r);
19 }
20 
21 int main() {
22     int n, k;
23     cin>>n>>k;
24     for(int i=0; i<n; i++) cin>>a[i];
25     quickSort(0, n-1);
26     cout<<a[k-1]<<endl;
27     return 0;
28 }

③直接找下标k-1对应的那个值,每次只需判断k-1所在区间(左区间还是右区间)然后对其递归排序即可,省去了对另一个区间排序的操作

 这是某个大佬的思路,原链接请click here.

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 using namespace std;
 6 const int max_n=1e5+5;
 7 int a[max_n];
 8 
 9 void quickSort(int l, int r, int k) {
10     if(l>=r) return;
11     int i=l-1, j=r+1, x=a[l+r >> 1];
12     while(i<j) {
13         do i++; while(a[i]<x);
14         do j--; while(a[j]>x);
15         if(i<j) swap(a[i], a[j]);
16     }
17     if(k<=j) quickSort(l, j, k);
18     else quickSort(j+1, r, k);
19 }
20 
21 int main() {
22     int n, k;
23     cin>>n>>k;
24     for(int i=0; i<n; i++) cin>>a[i];
25     quickSort(0, n-1, k-1);
26     cout<<a[k-1]<<endl;
27     return 0;
28 }

 

posted @ 2020-09-15 17:59  自在逍遥处  阅读(125)  评论(0编辑  收藏  举报