給出三種思路亚再,僅供參考郭膛。。
1.思路一:根據(jù)快速排序劃分的思想氛悬,每次分割之后只考慮比軸大的一部分则剃,知道比軸大的一部分在比100多的時(shí)候,采用傳統(tǒng)排序算法排序圆雁,取前100個(gè)忍级。
step1:遞歸對(duì)所有數(shù)據(jù)分成[a,b),(b,d]兩個(gè)區(qū)間伪朽,(b,d]區(qū)間內(nèi)的數(shù)都是大于[a,b)區(qū)間內(nèi)的數(shù)
step2:對(duì)(b,d]重復(fù) step1操作轴咱,直到最右邊的區(qū)間個(gè)數(shù)小于100個(gè)。注意[a,b)區(qū)間不用劃分
step3:返回上一個(gè)區(qū)間烈涮,并返回此區(qū)間的數(shù)字?jǐn)?shù)目朴肺。接著方法仍然是對(duì)上一區(qū)間的左邊進(jìn)行劃分,分為[a2,b2)坚洽,(b2,d2]兩個(gè)區(qū)間戈稿,取(b2,d2]區(qū)間。如果個(gè)數(shù)不夠讶舰,繼續(xù) step3操作鞍盗,如果個(gè)數(shù)超過(guò)100的就重復(fù) step1操作,直到最后右邊只有100個(gè)數(shù)為止跳昼。
復(fù)雜度為O(10億*100)
2.思路二:先取出前100個(gè)數(shù)般甲,維護(hù)一個(gè)100個(gè)數(shù)的最小堆,遍歷一遍剩余的元素鹅颊,在此過(guò)程中維護(hù)小頂堆就可以了敷存。
具體步驟如下:
step1:取前m個(gè)元素(例如m=100),建立一個(gè)小頂堆堪伍。保持一個(gè)小頂堆得性質(zhì)的步驟锚烦,運(yùn)行時(shí)間為O(lgm);建立一個(gè)小頂堆運(yùn)行時(shí)間為mO(lgm)=O(m lgm);
step2:順序讀取后續(xù)元素觅闽,直到結(jié)束。每次讀取一個(gè)元素涮俄,如果該元素比堆頂元素小蛉拙,直接丟棄;如果大于堆頂元素禽拔,則用該元素替換堆頂元素刘离,然后保持最小堆性質(zhì)。最壞情況是每次都需要替換掉堆頂?shù)淖钚≡囟闷埽虼诵枰S護(hù)堆的代價(jià)為(N-m)O(lgm); 最后這個(gè)堆中的元素就是前最大的100個(gè)。時(shí)間復(fù)雜度為O(N lgm)茧痕。
復(fù)雜度為O(10億lg100)野来。
** 注:推薦采用這種算法。踪旷。*
3.采用局部淘汰法曼氛。
具體步驟如下:
step1:選取前100個(gè)元素,并排序令野,記為序列L舀患。
step2:然后一次掃描剩余的元素x,與排好序的100個(gè)元素中最小的元素比气破,如果比這個(gè)最小的要大聊浅,那么把這個(gè)最小的元素刪除,并把x利用插入排序的思想现使,插入到序列L中低匙。依次循環(huán),知道掃描了所有的元素碳锈。
復(fù)雜度為O(10億*100)
推薦閱讀:
經(jīng)典算法應(yīng)用之一----歸并排序(微軟筆試題)
經(jīng)典算法應(yīng)用之二----基數(shù)排序(google筆試題)
經(jīng)典算法應(yīng)用之三----應(yīng)用二中題目的升華
經(jīng)典算法應(yīng)用之四(上)---基本位操作之算法篇
經(jīng)典算法應(yīng)用之四(中)---基本位操作之算法篇
經(jīng)典算法應(yīng)用之四(下)---百度面試題
經(jīng)典算法應(yīng)用之五---隨機(jī)生成和為S的N個(gè)正整數(shù)
經(jīng)典算法應(yīng)用之六---過(guò)橋問(wèn)題和過(guò)河問(wèn)題
經(jīng)典算法應(yīng)用之七----10億數(shù)據(jù)中取最大的100個(gè)數(shù)據(jù)