從乙個無序陣列中求出第K大 小的數

2022-08-31 23:36:23 字數 495 閱讀 8310

這個題目可以作為練習寫大/小根堆的實現,不過貌似時間複雜度還是蠻高的。在洛谷上面一道模板題上面好像就超時了幾個點,不知道是不是我實現的問題。那麼除此之外,最容易想到的方法是先對該陣列進行排序,然後取出第k或max-k數來。當選擇使用快排的時候,時間複雜度是$o(nlogn)$。但還有一種更優的方法是利用快排劃分出來的主元位置再遞迴尋找,這種方法叫作隨機選擇演算法。它對任何輸入都可以達到$o(n)$的期望時間複雜度。

#include #include 

#include

//隨機選擇主元 其實也是快排的一種寫法

int randpartition(int a,int left,int

right)

a[left] =temp;

return

left;

} //

遞迴實現查詢k值

int randselect(int a,int left,int right,int

k)

無序陣列中找第K個的數

題目分析 也就是從小往大排,第k小那個數。方法1 排序 nlogn 方法2 利用堆 nlogk 首先將前k個元素構建最大堆,堆頂是前k個元素中第k小的元素。這步複雜度klogk 遍歷剩餘元素 這步複雜度 n k logk 如果新元素 堆頂 堆頂不可能是第k大元素 移除堆頂 將新元素插入堆 否則 新元...

試用O n 來實現求出乙個無序陣列的中位數

對於這個問題我起初就想到了多數派問題 那麼受這個問題的影響,我就先到了一種方法 就是建立乙個中間判斷元素。left right 兩個計數器來記錄,通過遍歷陣列的過程中,每次都是嘗試兩邊的元素數量盡量相同,在這個過程中,如果右邊多,那麼就讓下個元素分配在左邊,同理亦然 那麼用 實現就是簡單的 left...

無序數字中位數 如何在無序陣列中查詢第K小的值

如題 給定乙個無序陣列,如何查詢第k小的值。例子如下 在乙個無序陣列,查詢 k 3 小的數 輸入 arr 輸出 7在乙個無序陣列,查詢 k 4 小的數 輸入 arr 輸出 10幾種思路如下和複雜度分析如下 1 最簡單的思路直接使用快排,堆排或者歸併排,排序之後取陣列的k 1索引的值即可,時間複雜度為...