计数排序

Posted nkqlhqc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计数排序相关的知识,希望对你有一定的参考价值。

【基本思想】

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

  过程: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); // 将桶中的数字重新插入到数组中
}

 

以上是关于计数排序的主要内容,如果未能解决你的问题,请参考以下文章

算法-java代码实现计数排序

计数排序代码

计数排序Java代码实现

[leetcode]排序算法(冒泡排序,选择排序,插入排序,快速排序,计数排序)

计数排序再思考——从2020年1月第16题谈起

计数排序就是这么容易