桶排序可以看成是計數排序的公升級版,它將要排的資料分到多個有序的桶裡,每個桶裡的資料再單獨排序,再把每個桶的資料依次取出,即可完成排序。
我們拿一組計數排序啃不掉的資料[ 500,6123,1700,10,9999 ]
來舉例。
第一步,我們建立 10 個桶,分別來裝 0-1000 、1000-2000 、 2000-3000 、 3000-4000 、 4000-5000 、5000-6000、 6000-7000 、7000-8000 、8000-9000 區間的資料。
第二步,遍歷原陣列,對號入桶。
第三步,對桶中的資料進行單獨排序,只有第乙個桶中的數量大於 1 ,顯然只需要排第乙個桶。
最後,依次將桶中的資料取出,排序完成。
這個桶排序乍一看好像挺簡單的,但是要敲**就需要考慮幾個問題了。
桶這個東西怎麼表示?
怎麼確定桶的數量?
桶內排序用什麼方法排?
**如下:
void sort(vector& arr) else if(arr[i] < min)
}int diff = max - min;
// 桶列表
vector> bucketlist(length);
// 每個桶的存數區間
float section = (float)diff / (float)(leng -1);
// 資料入桶
for(int i = 0; i < length; i++)
bucketlist[num].push_back(arr[i]);
}// 桶內排序
for(int i = 0; i < bucketlist.size(); i++)
// 寫入原陣列
int index = 0;
for(vector&arrlist : bucketlist) }}
桶的數量我認為設定為原陣列的長度是合理的,因為理想情況下每個資料裝乙個桶。
桶內排序為了方便起見使用了當前語言提供的排序方法,如果對於穩定排序有所要求,可以選擇使用自定義的排序演算法。
在額外空間充足的情況下,盡量增大桶的數量,極限情況下每個桶只有乙個資料時,或者是每只桶只裝乙個值時,完全避開了桶內排序的操作,桶排序的最好時間複雜度就能夠達到 o(n)。
比如高考總分 750 分,全國幾百萬人,我們只需要建立 751 個桶,迴圈一遍挨個扔進去,排序速度是毫秒級。
但是如果資料經過桶的劃分之後,桶與桶的資料分布極不均勻,有些資料非常多,有些資料非常少,比如[ 8,2,9,10,1,23,53,22,12,9000 ]
這十個資料,我們分成十個桶裝,結果發現第乙個桶裝了 9 個資料,這是非常影響效率的情況,會使時間複雜度下降到 \(o(n\log n)\),解決辦法是我們每次桶內排序時判斷一下資料量,如果桶裡的資料量過大,那麼應該在桶裡面**自身再進行一次桶排序。
資料結構與演算法 桶排序
與基數排序法一樣,桶排序也是一種排序的思想。待排資料的值必須在乙個範圍內,然後把這個值域空間劃分為若干區塊,每乙個對應乙個桶,把待排陣列放入到合適的桶中,再對桶內的資料採用任意一種方式排序。整個時間複雜度分為兩部分,第一部分是入桶,為on,第二部分則是所有桶內排序的時間。演算法導論 中證明了這個整體...
Python 資料結構與演算法 桶排序
簡單的桶排序 defbucksort a bucks dict 定義乙個桶變數,型別為字典 for i in a bucks.setdefault i,每個桶預設為空列表 往對應的桶中新增對應相同元素 print bucks a sort for i in range min a max a 1 i...
演算法與資料結構 常用排序演算法總結2 桶排序
排序演算法大體可分為兩種 比較排序 氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等 非比較排序 基數排序,計數排序,桶排序等本文介紹非比較排序演算法中的桶排序演算法。桶排序的思想 對映函式。動態示意圖 顯然,桶內排序是桶排序效能好壞的決定因素。2 盡量的增大桶的數量。極限情況下每個桶只能...