《算法导论》第八章 计数排序、基数排序、桶排序 python实现

     1.    计数排序

    计数排序需要知道所有元素的范围,主要思想是:统计出每个数字出现了几次,存至C中,然后将C中的数字转为小于该数字的元素个数,然后从后往前依次填写,是稳定的排序方法。python实现如下:

def count_sort(A, k):
    """
    计数排序
    :param A:待排序列
    :param k:元素范围
    """
    C = [0 for i in range(k)]
    B = [0 for i in range(len(A))]

    for i in range(len(A)):
        C[A[i]-1] += 1

    for j in range(1,k):
        C[j] = C[j] + C[j-1]

    for i in range(len(A)-1, -1,-1):
        B[C[A[i]-1]-1] = A[i]
        C[A[i] - 1] = C[A[i]-1] - 1

    return B


if __name__ == "__main__":
    list = [3,2,4,2,1,5,4,3,6,4,5]
    print list
    list_sorted = count_sort(list, 6)
    print list_sorted

   2.基数排序

    基数排序针对多位数,从低位往高维排序,python实现为:

def stable_sort(A, d, k):
    """
    计数排序
    :param A:待排序列
    :param d:待排位数
    :param k:元素范围
    """
    A_index = [(A[i] / 10 ** d) % 10 for i in range(len(A))]
    C = [0 for i in range(k+1)]  # 考虑 0-9 k=9 C需要有坐标0-9 10个
    B = [0 for i in range(len(A))]

    for i in range(len(A)):
        C[A_index[i]] += 1

    for j in range(1, k+1):
        C[j] = C[j] + C[j - 1]

    for i in range(len(A) - 1, -1, -1):
        B[C[A_index[i]] - 1] = A[i]
        C[A_index[i]] = C[A_index[i]] - 1
    return B


def radix_sort(A, d):
    """
    基数排序
    :param A:待排序列
    :param d:元素位数
    """
    for i in range(d):
        A_temp = stable_sort(A, i, 9)  # 对第i位进行稳定排序
        A = A_temp
    return A
if __name__ == "__main__":
    list = [329, 457, 657, 839, 436, 720, 355]
    print list
    list_sorted = radix_sort(list, 3)
    print list_sorted

   3. 桶排序

   桶排序假设数组元素均匀分布,且知道区间范围,将范围划分为n个等分区间,给我感觉有点像哈希存储,python实现为:

def insert_sort(list):
    """插入排序"""
    for i in range(1, len(list)):
        j = i
        while j > 0:
            if list[j] < list[j-1]:
                list[j],list[j - 1] = list[j-1],list[j]
                j -= 1
            else:
                break

def bucket_sort(A):
    """桶排序"""
    n = len(A)
    B = [[] for i in range(n)]
    for i in range(n):
        B[int(math.floor(n*A[i]))].append(A[i])

    for i in range(n):
        insert_sort(B[i])

    C = []
    for i in range(n):
        C.extend(B[i])
    return C

if __name__ == "__main__":
    list = [0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68]
    print list
    list_sorted = bucket_sort(list)
    print list_sorted

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值