数组中任意第k大的数字

本文介绍了一种基于快速排序原理的快速选择算法,该算法通过模仿partition方法,每次递归只处理一半的数据,从而有效地找到第k大的元素。文章提供了一个Python实现的例子,展示了如何在一组数字中找到第五大的数。

模仿partion方法,当high=low小于k的时候,在后半部分搜索,当high=low大于k的时候,在前半部分搜索。与快排不同的是,每次都减少了一半的排序。

def partitionOfK(numbers, start, end, k):
    if k < 0 or numbers == [] or start < 0 or end >= len(numbers) or k > end:
        return None
    low = start
    high = end
    key = numbers[start]
    while low < high:
        while low < high and numbers[high] >= key:
            high -= 1
        numbers[low] = numbers[high]
        while low < high and numbers[low] <= key:
            low += 1
        numbers[high] = numbers[low]
    numbers[low] = key
    if low < k:
        return partitionOfK(numbers, start + 1, end, k)
    elif low > k:
        return partitionOfK(numbers, start, end - 1, k)
    else:
        return numbers[low]
numbers = [3,5,6,7,2,-1,9,3]
print(sorted(numbers))
print(partitionOfK(numbers, 0, len(numbers) - 1, 5))

输出:返回了第五大排序的数字

[-1, 2, 3, 3, 5, 6, 7, 9]
6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值