【Python】【輸出前m大的數】
阿新 • • 發佈:2019-02-13
問題:
給定一個數組包含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)