轻松理解和实现计数排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/petrelselina/article/details/38556535

任何排序算法都是在某种情况下才能体现它的优势,没有绝对好的排序算法,当然也没有绝对糟糕的算法。

计数排序不同于以往的排序算法,原因在于它不是直接将数字的位置移动,而是采用了很巧妙的方式。

说到使用场合,先要谈原理了。

假设要排序的数是 3 2 2 4 3 2 1 7 5 4 5 6 1(随便编的)。所谓计数,就是对每一种数进行统计。比如,这些数字中 2有 三个,3有两个。这可以发现一点,计数算法适合重复数字比较多的情况。计数排序的核心就是计数并记录下来。这就涉及到如何记录的问题。

首先,我们找出这些数中最大的数和最小的数,7和1,好,也就是说,我们所有的数都在这个之间,那么我们用来记录的数组大小就是7(1-7有7个数)。那么这个数组的下标就是0-6.记录的方式是这样的:

遍历待排序的数,首先遇到3,我们就在记录数组的相应位置上+1,数组初始都是0的。什么叫相应位置?就是我最小的数对应记录数组的0位置,依次对应。也就是,遇到3,我在数组下表为2的位置+1。遇到2,我在下标为1的位置+1。依次类推,遍历结束后即可得到这样的数组 2 3 2 2 2 1 1 。好,我们可以轻易在这个数组中发现 1有两个,2有三个,3有两个 等等等。是不是就排序好了呢。

这里我们发现,计算排序适合的场合需要是数据较为集中的、连续的、重复的。像 1 100 200 20 10000这样的数排序显然不适合。下面就用python来实现这个算法吧

li=[7,2,4,5,1,2,3,3,2,6,0,9,1,3]
li_new=[]

max_num=li[0]
min_num=li[0]
for num in li:
    if num>max_num:
        max_num=num
    if num<min_num:
        min_num=num
count=[]
for num in range(max_num-min_num+1):
    count.append(0)
for num in li:
    count[num-min_num]+= 1
for index in range(len(count)):
    while count[index]>0:
        li_new.append(index+min_num)
        count[index]-=1
print li_new
        


猜你喜欢

转载自blog.csdn.net/petrelselina/article/details/38556535