问题:
给定一个数组包含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)