尋找陣列中第n大的元素

2021-08-19 02:50:35 字數 1614 閱讀 4384

給定乙個陣列,找出該陣列中第n大的元素的值。其中,1<=n<=length。例如,給定乙個陣列a=,當n=1時,返回9

我拿到這個問題的地中思路就是先排序,然後通過位置索引相應的第n大的元素。我使用的是o(nlog(n))級別的排序演算法,所以這種方法的時間複雜度應該也是o(nlog(n))級別的。

那這個問題有沒更好的解決辦法呢?是有的,我們參考快速排序的思想,可以做到o(n)級別。在此之前我們先回顧一下快速排序。

我這裡只是簡述以下快速排序的思路。快速排序中最重要的就是partition操作,就是將我們最左邊的數k移動到最佳位置(k左邊的數都小於kk右邊的數都大於k

我們通過以下這個例子回顧以下具體操作方式

具體的partition操作**

template

<

typename t>

int__partition

(t arr,

int l,

int r)

} std::

swap

(arr[l]

, arr[j]);

return j;

}

上面**是最基礎的操作。

我們通過快速排序中的思想,可以很快地解決這個問題

template

<

typename t>

int__partition

(t arr,

int l,

int r)

} std::

swap

(arr[l]

, arr[j]);

return j;

}template

<

typename t>

int__selection

(t arr,

const

int& l,

const

int& r,

const

int& k)

template

<

typename t>

intselection

(t arr,

const

int& n,

const

int& k)

我們回顧上面的做法,不難發現,我們每次對問題的規模縮小一半,演算法複雜度為

n + n/2 + n/4 + ... + 1 = 2n,即為o(2n)

尋找陣列中的第K大的元素

遇到了乙個很簡單而有意思的問題,可以看出不同的演算法策略對這個問題求解的優化過程。問題 尋找陣列中的第k大的元素。最簡單的想法是直接進行排序,演算法複雜度是o n logn 這麼做很明顯比較低效率,因為不要求別的資訊只要計算出第k大的元素。當然,如果在某種情況下需要頻繁訪問第k大的元素就可以先進行一...

經典演算法題 尋找陣列中第k大的元素

問題描述 在陣列中找到第 k 大的元素。要求時間複雜度為o n 空間複雜度為o 1 分析 此類問題為排序問題,主要難點在於時間複雜度為o n 採用快速排序演算法進行排序 function quicksort nums,k,start,end var left start,right end var ...

尋找陣列中的第K大元素

一 簡述 使用資料結構堆,實現查詢陣列中的第k大元素。流程如下 陣列內容堆化 因為是查詢第k大,所以使用大根堆 依次取出並刪除堆的根節點 將剩餘元素堆化 取到第k個即為目標元素。二 實現 include include using namespace std intfindkth vector in...