排序2(桶排序、计数排序、基数排序)_python

1.桶排序
桶排序是设计一定数值范围的桶,将属于这个范围的数值放在桶中,然后将元素在每个桶中排序,再按照桶的顺序输出桶中的排序。

def tong_sort(nums):
    start = min(nums)
    end = max(nums)
    tong = (end - start) // len(nums)
    tong_list = [[] for i in range(len(nums) + 1)]
    for i in nums:
        tong_list[int((i-start)//tong)].append(i)
    nums.clear()
    for i in tong_list:
        for j in quick_sort(i):
            nums.append(j)
    return nums

def quick_sort(nums):
    if len(nums) < 2:
        return nums
    mid = nums[0]
    left = []
    right = []
    for i in nums[1:]:
        if i <= mid:
            left.append(i)
        else:
            right.append(i)

    return quick_sort(left) + [mid]+quick_sort(right)

当待排序数组的差过小时出现问题
在这里插入图片描述

2.计数排序
计数排序按照我的理解就是将无序数组中的值将其出现的次数储存到新数组中,然后打印次数不为零的数值,有多少次打印多少个

无序数组:[8,5,6,5,3,2,2,9]
初始数组:[0,0,0,0,0,0,0,0,0,0]
出现次数:[0,0,2,1,0,2,1,0,1,1]

def count_sort(nums):
    if len(nums)<2:
        return nums
    s = []
    arr = [0 for _ in range(max(nums)+1)]
    for i in nums:
        arr[i]+=1

    for i in range(len(arr)):
        if arr[i] != 0:
            for j in range(arr[i]):
                s.append(i)
    return s

3.基数排序
基数排序是先根据数组元素个位大小排序,再用刚刚排序一轮的数组根据元素十位大小排序,依次类推。

在这里插入图片描述
这张图还是不太好看,下面是菜鸟教程的图,菜鸟教程传送门
在这里插入图片描述

def radix_sort(arr):
    n = len(str(max(arr)))  # 记录最大值的位数
    for x in range(n):#最大值位数轮排序
        lis = [[] for i in range(10)]#每一位数字都是0到9
        for i in arr:
            lis[i//(10**x)%10].append(i) #把数值按照个位或十位的的大小存储到对应的数组位置上
        # print(lis)
        #下面的功能是:因为数组有些位置上是由多个相同个位组成的数组,所有需要对整个数组排序 [[], [81, 41], [62], [23], [], [], [16], [37], [], [59]]
        arr = []
        for i in lis:
            for j in i:
                arr.append(j)
    return arr

三种排序的区别:
桶排序:划分元素范围将范围内的元素放在一个桶,桶内再排序,按桶的顺序输出

计数排序:将元素出现的次数计数,有几次输出几次

基数排序:按元素的个位大小(相同个位存储在同一数组中),将刚刚个位排序的数组再按十位大小排序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值