【A-排序】python实现八大排序算法之8-计数排序

计数排序

计数排序步骤:
假设输入是一个数组Lst[0…n-1],Lst.length=n,我们还需要两个数组,B[0…n-1]存放排序的输出,Temp[0…k]提供临时存储空间。
1-第一个for循环后,C中存放的是等于i的元素的个数。
2-第二个for循环后,C中存放的是小于或者等于i元素的总数。
3-第三个for循环,可以把每个元素A[j]放到它在输出数组B中的正确位置上。


'''
Creat by HuangDandan
2018-08-17
[email protected]
计数排序

思想:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上了
例如,如果有17个元素小于x,则x就应该在第18个输出位置上
对于相同元素的情况,认为第一个出现的元素比后面出现的元素要大

步骤:
假设输入是一个数组Lst[0...n-1],Lst.length=n,我们还需要两个数组
temp[0...n-1](一共n个元素,和原列表的元素个数一样)存放排序最后的输出
B[0...k](一共k+1个元素)存放小于或者等于i元素(等于下标值元素)的总数,这里的k为列表中最大的元素值,k值对应的下标为k+1

1-第一个for循环后,B中存放的是等于i的元素的个数。
2-第二个for循环后,B中存放的是小于或者等于i元素的总数,因为包含了等于,在最后一个循环里的下标-1


难点:
1-计数列表中的元素个数怎么确定 和排序列表中的最大值有关 max[Lst]
2-temp列表temp[CLst[Lst[i]]-1] = Lst[i]

'''

def CountingSort(Lst):
    '''
    for i in range(k):
        CLst.append(0)
    CLst = [0]*(k+1)
    '''

    k = max(Lst)
    n = len(Lst)
    B = [0 for i in range(k+1)]
    temp = [0 for i in range(n)]

    for i in range(n):
        B[Lst[i]] += 1
    for j in range(0, k):
        B[j+1] = B[j+1] + B[j]
    for i in range(n-1,-1, -1):
        temp[B[Lst[i]]-1] = Lst[i]  #-1是关键
        B[Lst[i]] -= 1

    return temp



if __name__ == "__main__":
    Lst1 = [1,1,0,2]
    print(Lst1)
    print("----------------------------------------")
    # print(max(Lst1))
    print(CountingSort(Lst1))
    # Lst2 = [None for i in range(10)]
    # print(Lst2)

参考博客文章:https://blog.csdn.net/zhang_xiaomeng/article/details/72675918 python程序实现

猜你喜欢

转载自blog.csdn.net/u010591976/article/details/81810139