【基本思想】
计数排序类似与桶排序,也是用空间换取了时间,计数排序要求数组必须在一个确定的区间内。
过程: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); // 将桶中的数字重新插入到数组中 }