当前位置: 首页 > article >正文

排序算法(系列)

希尔排序(Shell Sort)是一种插入排序的改进版本。它是基于插入排序的思想,通过将待排序的元素进行分组,然后对每组进行插入排序,逐步减少分组的大小,最终完成排序。希尔排序的核心思想是将序列分为多个子序列,对每个子序列进行插入排序,然后逐步缩小子序列的长度,直到最后一次对整个序列进行插入排序。

计数排序(Counting Sort)是一种非比较排序算法,它通过确定每个元素在数组中的位置来完成排序。计数排序的核心思想是统计每个元素的出现次数,并根据出现次数确定元素在排序后的最终位置。计数排序适用于待排序元素为确定范围的整数的情况。

桶排序(Bucket Sort)是一种排序算法,它将待排序的元素划分为多个桶,每个桶中存放一定范围内的元素。然后对每个桶中的元素进行排序,最后将所有桶中的元素按桶的顺序依次取出,即得到排好序的序列。桶排序适用于待排序元素分布均匀的情况。

基数排序(Radix Sort)是一种多关键字排序算法,它将待排序元素按照关键字的各个位进行排序。基数排序从最低位开始,对每个关键字进行排序,直到最高位。基数排序可以用于对十进制、二进制等各种进制的数进行排序。基数排序的核心思想是按照关键字的各个位进行分配和收集,通过多次分配和收集来完成排序。

这四种排序算法都有各自的特点和适用范围,可以根据具体问题的要求选择合适的排序算法。

目录

希尔排序

计数排序O(n)

桶排序

基数排序

基数排序

基数排序的实现


希尔排序

基于插入排序(摸牌)(把插入排序中的1换成了gap)

# 希尔排序
def insert_search_gap(li,gap):
    for i in range(gap,len(li)):      # i 表示趟数,也表示未排序的数的下标
        temp = li[i]        # 用于存储将要排序的数
        j = i-gap     # 表示已排序好的数下标
        while j >= 0 and li[j] > temp:          # 找出能够插入的位置
            li[j+gap] = li[j]         # 向右移动 空出位置放置li[i]
            j -= gap              # 下标向前指 继续比较
        li[j+gap] = temp
​
def shell_sort(li):
    d = len(li)//2
    while d > 0:
        insert_search_gap(li,d)
        d //= 2
​
​
li = list(range(100))
import random
random.shuffle(li)
print(li)
shell_sort(li)
print(li)

计数排序O(n)

# 计数排序
def count_sort(li,max_count=100):     #max_count = 100默认最大的数是100
    count = [0 for _ in range(max_count+1)]
    for val in li:
        count[val] += 1
    li.clear()
    for ind,val in enumerate(count):       # ind列表下标 val下标次数
        for j in range(val):
            li.append(ind)
​
import random
li = [random.randint(0,100)for _ in range(1000)]
print(li)
count_sort(li)
print(li)

桶排序

时间复杂度较难讨论

适用于分布均匀且数额较大。

# 桶排序  不重要
def bucket_sort(li,n = 100,max_num = 10000):
    bucket = [[] for _ in range(n)]     # 创建桶
    for var in li:
        i = min(var //(max_num // n), n-1)      # i 表示var放到几号桶 若100桶,但是没有这时候就放在n-1 = 99
        bucket[i].append(var)
    # 保持桶里边的顺序
    for j in range(len(bucket[i])-1,0,-1):
        if bucket[i][j] < bucket[i][j-1]:
            bucket[i][j],bucket[i][j-1] = bucket[i][j-1], bucket[i][j]
        else:
            break
    sorted_li = []
    for buc in bucket:
        sorted_li.extend(buc)
    return sorted_li
​
import random
​
li = [random.randint(0,100)for i in range(10000)]
# print(li)
li = bucket_sort(li)
print(li)

基数排序(O(kn))

基数排序

先按照个位进行桶排序(按照个位进桶再依次出来),再按照十位进行桶排序(一样)

基数排序的实现

# 基数排序的实现
# 时间复杂度O(kn)(k表示数字位数)
def radix_sort(li):
    max_num = max(li)      # 最大值9—>1次分桶,99->2,888->3,10000->5
    it = 0
    while 10 ** it <= max_num:
        buckets = [[] for _ in range(10)]
        # 分桶
        for var in li:
            # 取个位it=0,987%10=7
            # 取十位987 it=1  987//10->98 98%10=8
            # 取百位987 it=2   987//10^it=9 9%10=9
            digit = (var//10**it) % 10
            buckets[digit].append(var)
        li.clear()
        for buc in buckets:
            li.extend(buc)
        it += 1


import random
li = list(range(1000))
random.shuffle(li)
radix_sort(li)
print(li)


http://www.kler.cn/a/459752.html

相关文章:

  • PostgreSQL的备份方式
  • 【数据结构】双向循环链表的使用
  • 注入少量可学习的向量参数: 注入适配器IA3
  • git注意事项
  • logback日志框架源码分析
  • vs2022编译opencv 4.10.0
  • 智慧农业物联网传感器:开启农业新时代
  • 史上最全 Git 图文教程(非常详细)零基础入门到精通,收藏这一篇就够了
  • 如何在CentOS 6上安装和配置Apache与PHP?
  • 高效学习资源网站汇总
  • Centos 7 二进制安装时序数据库TDengine_我和国产时序数据库的第一次亲密接触
  • 服务器主机测试网络
  • C# checked 和 unchecked 的使用
  • 安卓平台或者WEBGL平台编辑器内加载AB包紫色真机正常
  • 网页排名:PageRank 算法的前世今生
  • Android 模拟器系统镜像选择指南
  • 2024年API接口发展趋势:智能化、自动化引领电商数据流通
  • AndroidStudio之logcat使用技巧
  • PyTorch快速入门教程【小土堆】之土说卷积操作
  • MyBatis-Plus 中 @TableField 注解详解
  • JavaScript(五):JSON
  • 【大模型实战篇】Mac本地部署RAGFlow的踩坑史
  • 短视频平台的视频水印怎么去除?
  • Postman[7] 内置动态参数及自定义的动态参数
  • 【期末大作业】使用Python熟练掌握面向对象
  • 在 Ubuntu 24.04.1 LTS | Python 3.12 环境下部署 Crypto 库