p1_2第k个数(快速选择算法)
题目:
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。
输入格式
第一行包含两个整数 n 和 k。
第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。
输出格式
输出一个整数,表示数列的第 k 小数。
数据范围
1≤n≤100000,
1≤k≤n
输入样例:
5 3
2 4 1 5 3
输出样例:
3
#时间复杂度2n,即O(n),比快速排序法快,所以不直接先快速排序再输出第k个数
def main():
n,k=map(int,input("n&k\n").split())
nums=list(map(int, input("nums\n").split()))
quick_selet(nums, 0, n-1, k)#下标是从0开始的 扩充在函数里面扩,不是在这里扩,否则会导致子列无法扩充
print(nums[k-1])#不是k
def quick_selet(nums, l, r, k): #其实nums作为全局变量这里可以不写,python中先局部在全局
if l>=r:
return
x=nums[(l+r)//2]
i=l-1
j=r+1
while i<j:
while True:
i+=1
if nums[i]>=x: break
while True:
j -= 1
if nums[j]<=x: break
if i<j: nums[i], nums[j]=nums[j], nums[i]
if j-l+1>=k: quick_selet(nums, l, j, k)#不是if j>=k
else: quick_selet(nums, j+1, r, k-(j-l+1))#最后一个参数不能写k-j,因为长度应是j-l+1
main()