【基本思想】
假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
【算法复杂度】
桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。
很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。
【动图演示】
【算法实现】
/* ** 桶排序算法的C++实现 ** 假设:对N个数字进行升序排序 ** 每个桶中的数据结构为:List-链表 */ void bucketSort(vector<int>& seq){ list<int> bucket[11]; // 定义桶的大小 int min = seq[0],max=seq[0]; for(int k=1;k<seq.size();k++) { //找到最大值最小值 if(seq[k]<min) min=seq[k]; if(seq[k]>max) max=seq[k]; } int len = max - min; for(int i=0;i<seq.size();i++){ bucket[(seq[i]*10)/len].push_back(seq[i]); // 将数字按照映射放入桶中 } for(int i=0;i<11;i++){ bucket[i].sort(); // 分别对每个桶中的数字排序(这里调用了STL链表自身的排序算法) } seq.clear(); for(int i=0;i<11;i++){ while(bucket[i].size()){ // 将桶中的数字放回数组中 seq.push_back(bucket[i].front()); bucket[i].pop_front(); } } }