第k个数(快速选择算法)python3

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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值