1. 程式人生 > >【Python】【輸出前m大的數】

【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)