1. 程式人生 > >桶排序(BucketSort)思想與實現

桶排序(BucketSort)思想與實現

  桶排序屬於簡單而且易於理解的排序演算法,接下來介紹一下該演算法的思想。

(1) 桶排序的思想

  桶排序的思想就是:首先遍歷一遍陣列,找出陣列中值最大的元素,假設最大的元素為Max;然後定義Max+1個“桶”,可以用“佇列”“棧”來定義;之後再遍歷一遍陣列,將元素值為i的元素放在第i個桶中;最後從第0個桶開始遍歷,將桶中的元素依次放入原有陣列中,直到遍歷到第Max個桶為止。

  由此可見,桶排序目的是以擴大記憶體空間為代價,從而減少時間複雜度。但是假若陣列中的元素很少,而陣列中值最大的元素非常大的時候,用這種演算法顯然也不能減少時間複雜度,故實際中很少用到這種排序演算法。此外,對於浮點型的資料,這種演算法就非常不適合,除非找到桶的下標(因為桶的下標為整型)與數值精度的對映關係。在桶排序的基礎上,對該演算法進行了改進,產生了“基數排序”

讀者若是想了解“基數排序”思想,可以點選這裡

(2) 桶排序的實現

  本次排序演算法採用C++模版程式設計來實現。

#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);
}
原始陣列為:2   1   5   3   2   6   1   1   8   4   7

程式執行的結果為:1   1   1   2   2   3   4   5   6   7   8