计数排序

【基本思想】

  计数排序类似与桶排序,也是用空间换取了时间,计数排序要求数组必须在一个确定的区间内。

  过程:1. 首先找出数组的最大值和最小值;2. 遍历数组,以数字作为键,该数字出现的次数作为值插入哈希表中;3. 在最小值到最大值这个区间内遍历哈希表,将数字反向插入数组中。

【算法复杂度】

  计数排序是一个稳定的排序算法。当输入的元素是 n 个 0到 k 之间的整数时,时间复杂度是O(n+k),空间复杂度也是O(n+k),其排序速度快于任何比较排序算法。当k不
是很大并且序列比较集中时,计数排序是一个很有效的排序算法。

【动图演示】

【算法实现】

/*
** 计数序算法的C++实现
** 假设:对N个数字进行升序排序
** 利用STL-HashMap的属性:
**  1.当键不存在时,则新增,初始值默认为0
**  2.当键不存在时,if条件判断的结果为false
*/
void countingSort(vector<int>& seq){
    map<int,int> record;    // 定义桶
    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];
    }
    for(int i=0;i<seq.size();i++) record[seq[i]]++; // 将数字放入对应的桶中
    seq.clear();
    for(int j=min;j<=max;j++) if(record[j]) seq.insert(seq.end(),record[j],j); // 将桶中的数字重新插入到数组中
}

 

posted @ 2019-05-03 16:24  梦醒时夜续  阅读(215)  评论(0编辑  收藏  举报