计数排序python实现及分析

      本文主要介绍如何使用python代码实现计数排序,同时分析这种排序方式的时间复杂度和空间复杂度。并不是所有的序列都适合使用计数排序这种方式,计数排序的一个大前提就是序列中的每个数字都必须为0到k的整数。计数排序的思想就是对于数组A中一个元素x,如果能确定小于x的元素个数为 y,那就能可以直接将x放置于A[y]的位置上。

      以下说明下计数排序的过程。以《算法导论》这本书的一个例子进行说明:

      初始化数组: A[2,5,3,0,2,3,0,3]

      假设我们已经事先知道A数组的最大值5,排序过程如下:

      a)创建一个长度为6的临时存储数组空间C,并将C数组每一个元素初始化为0。

      b)统计重复元素的个数。A数组的元素作为数组C的下标,扫描数组A,A数组元素每出现一次,数组C等于该元素的下标位置的元素加一。例如第一次扫描到的是2,则C[2]=0+1=1,......,第五次再次扫描到了2,C[2]=1+1=2,说明这个数组2的个数为2个。C[2,0,2,3,0,1]

      c)计算有多少(y)个元素小于或等于数组C的下标。C[2,2,4,7,7,8] (小于等于0的有2个,小于等于1的有2个,小于等于2的4个,......小于等于5的有8个)

    d)倒序扫描数组A的元素x,依次将元素放置于输出序列B[y]位置,y为小于或者等于这个元素的个数,同时临时数组C[x]=C[x]-1;重复这个过程直至扫描到数组A的首位元素。B[0,0,2,2,3,3,3,5]

      简而言之就是先统计出数组A元素x小于或等于自身的元素个数y,将x放置于B[y]处,y-1,接着重复这个过程。

用python代码实现如下:

def su_counting_algorithm(A,B,k):
    C=range(k+1)
    for i in range(0,k+1):
        C[i]=0
    for j in range(0,len(A)):
        C[A[j]]=C[A[j]]+1
    for i in range(1,k+1):
        C[i]=C[i]+C[i-1]
    for j in reversed(range(0,len(A))):
        B[C[A[j]]-1]=A[j]
        C[A[j]]=C[A[j]]-1
    return B

A=[2,5,3,0,2,3,0,3]
B=range(len(A))
print A
print su_counting_algorithm(A,B,5)

运行结果:


计数排序是是牺牲空间复杂度来使时间复杂度达到线性增长。

时间复杂度为O(n)

空间复杂度为O(n)

对于小规模排序计数排序的时间复杂度和空间复杂度都是效率较高的,但是计数排序对输入有限制,并不是所有情况下都能使用这种排序算法。



你可能感兴趣的:(算法)