算法导论程序15-计数排序(Python)

计数排序假设n个输入元素中的每一个都是在0到k区间内的一个整数,其中k为某个整数。


计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上了,例如,如果有17个元素小于x,则x就应该

在第18个输出位置上,当有几个元素相同时,这一方案要略做修改。因为不能把它们放在同一个输出位置上。

假设输入是一个数组A[0...n-1],A.length=n,我们还需要两个数组,B[0...n-1]存放排序的输出,C[0...k]提供临时存储空间。

def counting_sort(A,B,k):
    n=len(A)
    C=[]
    for i in range(0,k+1):
        C.append(0)
    for j in range(0,n):
        C[A[j]]=C[A[j]]+1
    for i in range(1,k+1):
        C[i]=C[i]+C[i-1]
    for j in range(n-1,-1,-1):
        B[C[A[j]]-1]=A[j]
        C[A[j]]=C[A[j]]-1

运行结果:

>>> A=[2,5,3,0,2,3,0,3]
>>> B=[0,0,0,0,0,0,0,0]
>>> k=5
>>> counting_sort(A,B,k)
>>> A
[2, 5, 3, 0, 2, 3, 0, 3]
>>> B
[0, 0, 2, 2, 3, 3, 3, 5]

第二个for循环后,C中存放的是等于i的元素的个数。

第三个for循环后,C中存放的是小于或者等于i元素的总数。

第四个for循环,可以把每个元素A[j]放到它在输出数组B中的正确位置上。如果所有n个元素都是互异的,那么当第一次执行第四个for循环时,对每一个A[j]值来说,C[A[j]]-1就是A[j]在输出数组中的最终正确的位置。我们每将一个A[j]放入数组B中以后,都要将C[A[j]]的值减一。这样,当遇到下一个值等于A[j]的输入元素(如果存在)时,该元素可以直接被放到输出数组中A[j]的前一个位置上。


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