桶排序

【基本思想】

  假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。

【算法复杂度】

  桶排序最好情况下使用线性时间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();
        }
    }
}

 

posted @ 2018-10-10 19:36  梦醒时夜续  阅读(166)  评论(0编辑  收藏  举报