【Python】【输出前m大的数】

问题:

给定一个数组包含n个元素,统计前m个大的数,并把这m大的数从大到小排列给出

输入

第一行为一个整数,表述要输出的前m个数

第二行为n个整数,给出需要排序的数组

输出

从大到小的m大的数

例子

绿色的是输入白色的是输出

思想:

先找m个大的放在数组右边然后再进行排序。找m个大的排在右边的思想是对整个数组进行一次快速排序,看返回的中间位置到数组最后的大小k,如果刚好等于m,就返回数组;如果k>m,对右边的再进行快速排序;如果k<m,对左边的数组排序取m-k最大的数。

选取好后直接进行快速排序,获得结果。

代码:

def maxk(nums,sta,end,k):
    if sta>=end:
        return
    if len(nums)==k:
        return nums
    mid = nums[sta]
    i = sta
    j = end
    while sta!=end:
        while end>sta and nums[end]>=mid:
            end-=1
        nums[sta], nums[end] = nums[end], nums[sta]
        while sta<end and nums[sta]<=mid:
            sta+=1
        nums[sta],nums[end]=nums[end],nums[sta]
    if j - sta +1 == k:
        return
    if j-sta == k:
        return
    if j - sta > k:
        maxk(nums,sta+1,j,k)
        return
    if j - sta+1< k:
        maxk(nums, i, sta-1, k-(j - sta+1))
        return


def quicksort(nums,sta,end):
    if sta>=end:
        return
    mid = nums[sta]
    i = sta
    j = end
    while sta!=end:
        while end>sta and nums[end]>=mid:
            end-=1
        nums[sta], nums[end] = nums[end], nums[sta]
        while sta<end and nums[sta]<=mid:
            sta+=1
        nums[sta],nums[end]=nums[end],nums[sta]
    quicksort(nums,i,sta-1)
    quicksort(nums,sta+1,j)


def main():
    k = int(input())
    nums=list(map(int, input().split()))
    maxk(nums,0,len(nums)-1,k)
    nums= nums[-k:][::-1]
    quicksort(nums,0,k-1)
    print(nums[::-1])


if __name__ == '__main__':
    main()

 

tips:直接用整个数组进行排序,不要一段一段的取,这样返回的时候会不能输出你想要的值,因为数组已经改变了。

复杂度为O(n+mlogm)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值