给定一个长度为 n的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。
输入格式
第一行包含两个整数 n 和 k。
第二行包含 n个整数(所有整数均在 1∼1091∼109 范围内),表示整数数列。
输出格式
输出一个整数,表示数列的第 k 小数。
数据范围
1≤n≤100000,
1≤k≤n
输入样例:
5 3
2 4 1 5 3
输出样例:
3
c++
#include <iostream>
using namespace std;
const int N = 100010;
int q[N];
int qsort(int q[], int l, int r, int k)
{
if(l>=r) return q[l];
int i = l-1, j = r+1, x=q[l+r>>1];
while(i < j)
{
do i++; while(q[i] < x);
do j--; while(q[j] > x);
if(i < j) swap(q[i], q[j]);
}
if( j-l+1 >= k) return qsort(q,l,j,k);
else return qsort(q, j+1, r, k-(j-l+1));
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0; i<n; i++) scanf("%d",&q[i]);
cout<<qsort(q,0,n-1,k)<<endl;
return 0;
}
python3
def quick_chose(l,r,k):
if l == r: #代码中存在不一致的缩进可能会引起IndentationError
return data[l]
i = l - 1
j = r + 1
pivot = data[(i+j) // 2]
while i < j:
while True: # 注意True要大写,或者直接使用while 1
i += 1
if data[i] >= pivot:
break
while True:
j -= 1
if data[j] <= pivot:
break
if i < j:
data[i],data[j] = data[j],data[i]
Sl = j - l + 1 # left数组的长度
# 不要使用内置函数名len作为变量名
if Sl >= k: #注意是>= ,要记得还有=的情况
return quick_chose(l,j,k)
else:
k -= Sl
return quick_chose(j+1,r,k)
if __name__ == "__main__":
#方法一
n,k = [int(x) for x in input().split()] #注意split()函数要加括号
data = [int(x) for x in input().split()] #注意split()函数要加括号
#方法二
#n, k = map(int, input().split()) # 修正input().split()函数调用
#data = list(map(int, input().split())) # 修正input().split()函数调用
l = 0
r = n - 1
minimum = quick_chose(l,r,k)
print(minimum)