排序(计数、希尔、基数)---python

本文介绍了三种线性时间复杂度的排序算法:计数排序、希尔排序和基数排序。计数排序通过统计每个元素出现次数实现排序;希尔排序是一种改进的插入排序,通过分组减少比较次数;基数排序则利用数字的位来排序,尤其适合处理正整数。此外,还展示了反转列表和数字的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#线性时间排序:时间复杂度为O(n)  计数排序,桶排序,基数排序
#计数排序
def count_sort(l,max_num = 100):
    count = [0 for _ in range(max_num + 1)]
    for val in l:
        count[val] += 1
    l.clear()
    for i, v in enumerate(count): #表示i这个数出现v次
        for _ in range(v):
            l.append(i)
    return l

l = [1,1,1,2,3,9,9,4,4,4,5,5]
print(count_sort(l))

#希尔排序是一种分组插入排序,每趟使整体数据越来越接近有序
def insert_sort_gap(l,d):
    for i in range(d,len(l)):
        tmp = l[i]
        j = i - d
        while j >= 0 and l[j] > tmp:
            l[j+d] = l[j]
            j -= d
        l[j+d] = tmp
def shell_sort(l):
    d = len(l)
    while d > 0:
        insert_sort_gap(l,d)
        d = d // 2
    return l

l = [3,4,5,2,7,34,11,23]
print(shell_sort(l))
#基数排序  (只能处理正整数)
def radix_sort(l):
    max_num = max(l)
    i = 0
    while (10**i <= max_num):
        buckets = [[] for _ in range(10)]
        for val in l:
            digit = val // (10**i) % 10
            buckets[digit].append(val)
        l.clear()
        for bucket in buckets:
            for val in bucket:
                l.append(val)
        i += 1
    return l
print(radix_sort([234,345,333,456,674,4567,23,345,56,67,78,6]))
#写l.reverse()函数   前后交换
#[1,2,3,4,5]  0,1
#[1,2,3,4,5,6] 0,1,2
#[1,2,3,4,5,6,7] 0,1,2
#  n // 2 - 1

def reverse_list(l):
    n = len(l)
    for i in range(n // 2):
        l[i], l[n-i-1] = l[n-i-1], l[i]
    return l

#反转数字

def reverse_int(num):
    res = 0
    while num > 0:
        res = res * 10
        res += num % 10
        num = num // 10
    return res
#数字为负数
def reverse_int1(num):
    is_neg = False
    if num < 0:
        is_neg = True
        num = num * -1
    res = 0
    while num > 0:
        res = res * 10
        res += num % 10
        num = num // 10
    if is_neg:
        res = res * -1
    return res

print(reverse_int1(-67801))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值