计数排序算法

1. 什么是计数排序

计数排序计数排序是一种非比较排序,使用一个额外的数组 C C C,其中第 i i i个元素是待排序数组 A A A中值等于 i i i的元素的个数。然后根据数组 C C C来将 A A A中的元素排到正确的位置。

2. 实现步骤

2.1 基础版

step1: 设待排序的数组为arr, 创建从range(0, max(arr)+1)数组,用来统计每个数字的出现的个数。
step2: 统计每个数组中每个元素的个数。
step3: 根据step2生成的数组,遍历range(0, len(arr)+1)中每个元素,每个元素出现几次,排序时就复制几次,生成排序结果。
示例:
排序以下数组arr = [5,7,2,5,1,6,5,8,6,2]
step1: 创建range(0, max(arr)+1)数组,其中,max(arr) = 8range(0, max(arr)+1) = [0,1,2,3,4,5,6,7,8]
计数排序算法_第1张图片
step2: 统计每个数组中每个元素的个数,其中,1出现1次,2出现2次,5出现3次,6出现2次,7出现1次,8出现1次
计数排序算法_第2张图片
step3: 根据step2生成的数组,从头遍历range(0, len(arr)+1)中每个元素,每个元素出现几次,排序时就复制几次,生成排序结果。1出现1次,复制1次,2出现2次,复制2次,5出现3次,复制3次,6出现 2次,复制2次,7出现1次,复制1次,8出现1次,复制1次,总体结果为:[1]*1 + [2]*2 + [5]*3 + [6]*2 + [7]*1 + [8]*1 = [1,2,2,5,5,5,6,6,7,8],所以, [5,7,2,5,1,6,5,8,6,2]排序后的结果为[1,2,2,5,5,5,6,6,7,8]
计数排序算法_第3张图片

2.2 优化版

基础版存在问题
设数组arr = [95, 94, 91, 98, 99, 90, 99, 93, 91, 92],如果创建range(0, max(arr)+1),会造成区间[0, 89]存储空间的浪费。
计数排序算法_第4张图片
计数排序算法_第5张图片
优化后
step1: 不再以range(0, max(arr)+1)作为数组,而是采用range(0, max(arr) - min(arr) + 1)作为数组,最小值90作为偏移量
计数排序算法_第6张图片
step2: 95被统计到95-90=5号位置, 94被统计到94-90=4号位置, 91被统计到91-90=1号位置, 98被统计到98-90=8号位置, 99被统计到99-90=9号位置,以此类推。
计数排序算法_第7张图片
step3: 根据step2生成的数组和偏移量,生成排序后的结果,[0 + 90] * 1+ [1+90]*2 + [2+90]*1 + [3+90]*1 + [4+90]*1 + [5+90]*1 + [8+90]*1 + [9+90]*2 = [90, 91, 91, 92, 93, 94, 95, 98, 99, 99]
计数排序算法_第8张图片
适用范围: 计数排序可用于在取值范围不是很大的情况下,对整数进行排序。

参考资料:
https://www.bilibili.com/video/BV1sU4y1R7pm/?spm_id_from=333.337.search-card.all.click&vd_source=63c3682e66febb42e6a271165dd5a13e

你可能感兴趣的:(数据结构,排序算法,算法,数据结构)