BucketSort(桶排序)原理及C++代碼實現


桶排序假設輸入數據服從均勻分布,平均情況下它的時間復雜度為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];
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM