桶排序假設輸入數據服從均勻分布,平均情況下它的時間復雜度為O(n)。
桶排序將輸入數據的區間均勻分成若干份,每一份稱作“桶”。分別對每一個桶的內容進行排序,再按桶的順序輸出則完成排序。
通常使用鏈表來實現桶。
代碼如下:(僅供參考)
void Insert(vector<double> & bkt, double num) { for (vector<double>::iterator p = bkt.begin(); p != bkt.end(); ++p) if (*p > num) { bkt.insert(p, num); return ; } bkt.push_back(num); //沒有找到,就放最后 } void BucketSort(double * const begin, double * const end) { //假設輸入數據都是小數[0,1) int n = end - begin; int i; vector<vector<double>*> bucket(n); //為什么是n個桶,應該和hash一個原理 for (i = 0; i < n; ++i) bucket[i] = new vector<double>; for (i = 0; i < n; ++i) { //按順序插入到桶中 Insert(*bucket[static_cast<int>(*(begin + i) * n)], *(begin + i)); } int j = 0, k = 0; for (i = 0; i < n; ++i) { while (k >= bucket[j]->size()) { //如果出現連續的空桶 ++j; k = 0; } *(begin + i) = (*bucket[j])[k++]; } for (i = 0; i < n; ++i) delete bucket[i]; }