引子:假如老师在统计学生成绩时,要将学生按组号排列,也就是按组1、2、3...分类。这种情况就可以采用键索引计数法。
第一步:频率统计
使用int数组count[]计算每个键(组号)出现的频率,如果键为r,则countr+1++; (注意为什么是r+1).
第二步:将频率转化为索引
使用count[]数组计算每个键在排序结果中的起始位置。一般来说,任意给定键的起始索引均为较小键所出现的频率之和,计算方法为countr+1 += countr; 从左到右将count[]数组转化为一张用于排序的索引表。
第三步:排序
将所有元素移动到一个辅助数组aux[]中进行排序。每个元素在aux[]中对应的位置由它的键对应的count[]决定。在移动之后将count[]中对应的元素值加1,来保证countr总是下一个键为r的元素在aux[]中的索引的位置。这个过程只需遍历一次即可产生排序结果,这种实现方法具有稳定性----键相同的元素排序后会被聚集到一起,但相对位置没有发生改变(后面两种排序算法就是基于此算法的稳定性来实现的)。
第四步:回写
将将排序的结果复制回原数组中。
代码实现见低位优先字符串排序。