在hadoop中,排序是mapreduce框架中最重要的操作之一,map task和reduce task都會對資料按照key排序,不管邏輯上是否真的需要排序,任何程式中的資料都會被排序,這是hadoop的預設行為。
[b]mapreduce中使用了兩種排序演算法:快速排序和優先佇列。在map和reduce task的緩衝區使用的是快速排序,而對磁碟上的ifile檔案合併使用的是優先佇列。[/b]
在學習hadoop中實現的快速排序之前,我們先來回顧一下之前的三篇文章[url=快速排序及改進[/url]、[url=取中位數的演算法[/url]和[url=三向切分的快速排序演算法:有大量重複元素的快速排序[/url],mapreduce中使用的快速排序在經典的快速排序之上進行了一些列的優化,具體優化處理如下:
1)、由於快速排序的分割基數(基數左邊的數都不大於該基數,而右邊的都不小於該基數)選擇的好壞直接影響快速排序的效能,最壞的情況是劃分過程中是中產生兩個極端不對稱稱的子串行——乙個長度為1而另乙個長度為n-1,此時有最壞的時間複雜度o(n^2),為了減小出現劃分嚴重不對稱的可能性,hadoop將序列的守衛和中間元素中的中位數作為選擇的分割基數;
2)、子串行的劃分方法,hadoop使用了兩個索引i和j分別從左右兩端進行掃瞄,並讓索引i掃瞄到大於等於分割基數為止,索引j掃瞄到小於等於分割基數為止,然後交換兩個元素,重複這個過程直到兩個索引相遇;
3)、對相同的元素的優化,在每次劃分子串行時,將於分割基數相同的元素放在中間位置,讓他不再參與後續的遞迴處理,即將序列劃分為三部分:小於分割基數、等於分割基數和大於分割基數;
4)、當子串行中元素數小於13時,直接使用插入排序演算法,不在遞迴。
對於這四種處理,再對照之前我們學過的《快速排序及改進》、《取中位數的演算法》和《三向切分的快速排序演算法:有大量重複元素的快速排序》,看看都用到了那些知識?
具體實現**如下:
談談演算法中的快速排序
快速排序 快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法 divide and conquermethod 快速排序使用分治法把乙個陣列,分為兩個子陣列,該方法的基本思想是 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大...
python中快速排序演算法
相比歸併排序來說快速排序在資料量小的情況下是不佔優勢的,因為快速排序的時間複雜度最好的情況下是n log n 但是在處理大量資料的時候歸併排序就不如時間排序了,因為在空間複雜度上面歸併排序消耗資源更多.所以我們可以做乙個判斷 如果列表長度小於某個數值的時候走if分支 而大於某個值的時候走else分支...
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...