数据结构与算法-计数排序

Posted PH丶

tags:

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

排序:实质上是要寻找一种置换,例如:

在置换的情况下,描述一下判定树模型:

判定树模型

数据结构与算法-计数排序

图中可以看出,深度决定了最坏情况,进而可以用来分析排序算法的下界问题。

数据结构与算法-计数排序

计数排序

数据结构与算法-计数排序

数据结构与算法-计数排序

A为输入数组,C为计数数组,统计A中元素出现的次数

然后将C中的元素进行累加得到一个新的累加数组

然后新申请一个数组存储排序后的结果(这个过程有两种)

  • 第一种:

倒序(为了保持稳定性)把A中的元素放入新申请的数组,步骤如下:

从A的最后一个数开始,3,然后在累加数组里面找3索引处对应的值:7,然后把这个数减一,变成6,把3放到结果数组的6索引处:

数据结构与算法-计数排序

然后处理0,按照上面的套路,把0放到结果数组的1索引处:

数据结构与算法-计数排序

以此类推,最后得到排序后的结果数组:

数据结构与算法-计数排序

python代码实现:

# 输入元素的数组
input_li = [int(i) for i in input("input elements:").split(" ")]

# 输入数组的最大元素
max_element = max(input_li)

# 统计元素个数的数组
count_li = [input_li.count(i) for i in range(max_element+1)]

# 再对统计个数的数组进行累加操作
add_li = [sum(count_li[:i+1]) for i in range(max_element+1)]

# 新申请一个和输入数组等长的数组(初始化为-1)
res_li = [-1 for i in range(len(input_li))]

# 倒序,先在add_li里找到对应元素的索引
for i in reversed(input_li):
   # 然后将这个索引减1作为res数组的索引
   add_li[i] -= 1
   # 最后将元素放到res数组对应的索引处
   res_li[add_li[i]] = i

print(res_li)
  • 第二种

第二种的计数数组和第一种不太一样:

数据结构与算法-计数排序

第二种方法多了一格,将第一种计数数组整体右移了一格,把待排序的元素值加一作为索引,统计出现次数。

数据结构与算法-计数排序

这样一来,累加后的数组指示的是起始位置,每次存储一个元素后需要对累加数组的值进行加一操作。

数据结构与算法-计数排序

其他元素以此类推。。。

这种方法对应代码:

# 输入元素的数组
input_li = [int(i) for i in input("input elements:").split(" ")]

# 输入数组的最大元素
max_element = max(input_li)

# 统计元素个数的数组
count_li = [input_li.count(i) for i in range(-1, max_element+1)]

# 再对统计个数的数组进行累加操作
add_li = [sum(count_li[:i+1]) for i in range(max_element+1)]

# 新申请一个和输入数组等长的数组(初始化为-1)
res_li = [-1 for i in range(len(input_li))]

# 先在add_li里找到对应元素的索引
for i in input_li:
   # 然后将这个索引作为res数组的索引,将元素放到对应的地方
   res_li[add_li[i]] = i
   add_li[i] += 1

print(res_li)


C++伪代码:

时间复杂度:

后一个其实是k+1,可以省略成k。

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

《数据结构与算法之美》10——排序桶排序计数排序基数排序

数据结构与算法-计数排序

算法:计数排序与桶排序

十大经典排序算法(下)

三种线性排序算法:计数排序桶排序与基数排序

买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)