快排解決 topK 中位數 問題

2022-06-20 01:45:09 字數 852 閱讀 3177

經常會有這種問題:

1.乙個100萬的無序陣列,在接近複雜度內找到其中位數。

2.乙個100萬的無序陣列,找到其第 k 大的數。

這種問題最常見,也最經常被問到!也有很多對應的解決方法。這裡給出一種用快排來解決問題的方法!

快排的效能在所有排序演算法裡面是最好的,資料規模越大快速排序的效能越優。快排在極端情況下會退化成 o(n^2) 的演算法,因此假如在提前得知處理資料可能會出現極端情況的前提下,可以選擇使用較為穩定的歸併排序。

快排本質上是一種分治策略,在一次迴圈結束,會有哨兵把陣列分成前半部分與後半部分。且以哨兵為界前半部分都不大於(小於)後半部分。

package main

import (

"fmt"

)func gettopk(arr int, k, left, right int) int

tmp := arr[left]

lpos := left

rpos := right

for lpos < rpos

if lpos < rpos

for ; lpos < rpos && arr[lpos] <= tmp; lpos++

if lpos < rpos

} arr[lpos] = tmp

if lpos == k else if lpos < k else

}func main()

for i := 0; i < len(arr); i++

}

執行結果:

快排思想求中位數

由於快速排序每一輪都可以將乙個元素正確的歸位,所以我們可以利用快速排序的思想來定位中位數。1 我們就以陣列的arr 0 為基準參照,如果第一輪快排過後,arr 0 的位置恰好被歸位到arr.length 2,則arr 0 肯定就是中位數 2 如果arr 0 歸位後,位置小於arr.length 2 ...

中位數及帶權中位數問題

資訊學競賽總是時不時與數學產生微妙的關係,中位數及帶權中位數問題有時常常成為解題的關鍵,今日有時間,所以梳理一下。先從一到簡單的題看起 士兵站隊問題 在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點由整數座標 x,y 表示。士兵們可以沿網格邊上 下 左 右移動一步,但在同一時刻任一網格點...

偽中位數問題

n個數的偽中位數定義為從小到大排序後第 n 1 2 個數。其中,x 的意思是x向下取整。現在,給你n個數,你需要向其中增加最少的數,使得k成為最後這一組數的偽中位數。請問你需要加入數的最少數 輸入第一行包含兩個數n,k,意為原來數的個數和最後的偽中位數。接下來一行輸入n個數,空格隔開,代表原來的數 ...