經常會有這種問題:
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個數,空格隔開,代表原來的數 ...