找一個無序陣列第m大的數的演算法
阿新 • • 發佈:2019-02-17
在一個個數為n的無序陣列中找第m大的數,基本思想無非還是排序的思想,只不過需要我們稍微對現有的排序演算法做些改動。
首先最簡單的冒泡,插入排序,我們可以先直接排序,然後遍歷到第m大的數,這個複雜度應該就是O(n^2),稍微想一下,我們好像還可以只維護一個大小為m的陣列用來儲存前m大的數,這樣複雜度就降低了一些,變成了O(n*m)。關於冒泡,插入,至今我只想出這兩個演算法,如有其他好的演算法歡迎分享。
接下來是堆排序,根據堆排序的過程,顯示初始化O(n),然後重複一個過程,就是 1,取堆頂,2,產生新的堆頂。 這樣我們當找到第m大的書以後,以後就不用再找了,所以,對於堆排序,我們的演算法複雜度可以降到O(k*logn)。
最後是利用快排的思想,我們知道快排是在每一層都是排n個數,既然我們這裡要求求第m大的數,所以其他的數的順序我們就不關心了,因此,我們每一次排完一層以後,先拿著中間數(就是快排中將陣列分成兩部分的那個數)的位置與m比較是大是小,然後拋棄一邊,只排剩下的一邊,這樣我們的演算法的時間複雜度就大大降低。
假設k=logn,那麼在我們快排演算法的理想環境下,我們發現我們的時間複雜度是O(1+2+4+....+2^k),也就是O(2*n)=O(n)。
因此,我們發現在求一個無序陣列的第m大的數時,可以做出比排序更好的演算法,而我目前所能想到的最好的演算法就是利用快排思想的那個演算法。