桶排序(BucketSort)思想與實現
阿新 • • 發佈:2019-01-29
桶排序屬於簡單而且易於理解的排序演算法,接下來介紹一下該演算法的思想。
(1) 桶排序的思想
桶排序的思想就是:首先遍歷一遍陣列,找出陣列中值最大的元素,假設最大的元素為Max;然後定義Max+1個“桶”,可以用“佇列”或“棧”來定義;之後再遍歷一遍陣列,將元素值為i的元素放在第i個桶中;最後從第0個桶開始遍歷,將桶中的元素依次放入原有陣列中,直到遍歷到第Max個桶為止。
由此可見,桶排序目的是以擴大記憶體空間為代價,從而減少時間複雜度。但是假若陣列中的元素很少,而陣列中值最大的元素非常大的時候,用這種演算法顯然也不能減少時間複雜度,故實際中很少用到這種排序演算法。此外,對於浮點型的資料,這種演算法就非常不適合,除非找到桶的下標(因為桶的下標為整型)與數值精度的對映關係。在桶排序的基礎上,對該演算法進行了改進,產生了“基數排序” ,讀者若是想了解“基數排序”思想,可以點選這裡。
(2) 桶排序的實現
本次排序演算法採用C++模版程式設計來實現。
原始陣列為:2 1 5 3 2 6 1 1 8 4 7#include <iostream> #include <iterator> #include <queue> using std::cout; using std::endl; using std::ostream_iterator; using std::queue; template<class T,size_t N> void PrintArr(T (&arr)[N]) { copy(arr,arr+N,ostream_iterator<T>(cout," ")); cout << endl; } template<class T,size_t N> void BucketSort(T (&arr)[N]) { size_t i(0),j(0),max(arr[0]); while(i < N) { if(arr[i] > max) { max = arr[i]; } i++; } queue<T> buckets[max+1]; i = 0; while(i < N) { buckets[arr[i]].push(arr[i]); i++; } i = 0; while(i <= max) { while(!buckets[i].empty()) { arr[j] = buckets[i].front(); buckets[i].pop(); j++; } i++; } } int main() { int arr[]= {2,1,5,3,2,6,1,1,8,4,7}; cout << "The init:" << endl; PrintArr(arr); cout << "The sort:" << endl; BucketSort(arr); PrintArr(arr); cout << "The final:" << endl; PrintArr(arr); }
程式執行的結果為:1 1 1 2 2 3 4 5 6 7 8