桶排序是一個經典的排序算法,特點是速度快,算法複雜度爲O(n),且是穩排,當然也是最耗空間的一種算法。
例如:
1)排序一組數[7,3,19,11,6,8,1,15]
最大數是19,那首先創建20個空桶,接着就是把這些數依次放進對應的桶中;
2)有重複的元素,如[7,3,9,11,6,3,7,14],這時候應該保證每個桶能放入多個元素,即最終保證排序穩定性,所以我選擇用鏈表來存儲每個桶中的元素,沒有元素則爲空鏈表。
以下代碼使用了我學習時寫的單向鏈表chain.h,類似於STL中forward_list。
/**************************************
*函數名稱:bucketSort
*參數說明:theChain 一個保存待排序的所有元素的單向鏈表
range 數組中的最大數
* 類說明:chain.h是個單向鏈表,前面學習線性表的時候創建
包含size(),empty(),get(index),erase(index),insert(index,element)
等成員函數
***************************************/
#include<iostream>
#include"chain.h"
using namespace std;
void bucketSort(chain<int> &theChain, int range)
{
//初始化桶
chain<int> *bucket = new chain<int>[range + 1];
int numberOfElements = theChain.size();
//從鏈表中一次取下元素,分別插入到對應的桶中
for (int i = 0; i < numberOfElements; ++i)
{
int x = theChain.get(0);
theChain.erase(0);
bucket[x].insert(0, x);
}
//依次從每個桶中取出元素插入到鏈表中
for(int j = range; j >= 0; --j)
while (!bucket[j].empty())
{
int y = bucket[j].get(0);
bucket[j].erase(0);
theChain.insert(0, y);
}
delete[] bucket;
}
int main()
{
chain<int> c;
for (int i = 0; i < 10; ++i)
c.insert(0, i + 1);
cout << c << endl; //10,9,8,7,6,5,4,3,2,1
bucketSort(c, 10); //1,2,3,4,5,6,7,8,9,10
cout << c << endl;
return 0;
}