码迷,mamicode.com
首页 > 编程语言 > 详细

BucketSort(桶排序)原理及C++代码实现

时间:2020-01-14 20:41:57      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:div   输出   情况   ack   输入   delete   span   iter   sort   

桶排序假设输入数据服从均匀分布,平均情况下它的时间复杂度为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];
}

BucketSort(桶排序)原理及C++代码实现

标签:div   输出   情况   ack   输入   delete   span   iter   sort   

原文地址:https://www.cnblogs.com/yxsrt/p/12193751.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!