rt,首先自己思考了一下。維護(hù)一個(gè)n的大項(xiàng)堆,然后輸出第k個(gè)根節(jié)點(diǎn)。當(dāng)然也是自己很簡(jiǎn)單的一個(gè)思路(可能是因?yàn)樽罱容^愛(ài)堆排序吧)其實(shí)堆排序是比較適合文件量級(jí)很大的情況下,這樣的效率比較快。比如后面文章提到的topk以及海量數(shù)據(jù)處理的面試。
(當(dāng)然也需要記得做一些異常處理!比如說(shuō)k>N的情況)
那么上網(wǎng)百度了一下。網(wǎng)上也給出了不同的答案。
1. 快速排序:從數(shù)組S中隨機(jī)找出一個(gè)元素X,把數(shù)組分為兩部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。這時(shí)有兩種情況:
1). Sa中元素的個(gè)數(shù)小于k,則Sb中的第k-|Sa|個(gè)元素即為第k大數(shù);
2). Sa中元素的個(gè)數(shù)大于等于k,則返回Sa中的第k大數(shù)。時(shí)間復(fù)雜度近似為O(n);
這樣也需要思考一下,數(shù)列本就是無(wú)序的情況,快排的每一次分區(qū)可以判斷第k大的數(shù)在分區(qū)的哪個(gè)位置
2. 建立堆排序,pop出第k個(gè)數(shù)
3. 用Merge Sort算法,整個(gè)算法復(fù)雜度為 O(NlgN), 然后找到第K個(gè)即可
4. select算法