题目描述
给定一个长度为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 }