排序算法(系列)

news/2025/1/3 6:39:53/

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

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

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

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

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

目录

希尔排序

计数排序O(n)

桶排序

基数排序

基数排序

基数排序的实现


希尔排序

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

python"># 希尔排序
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)//2while 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)

python"># 计数排序
def count_sort(li,max_count=100):     #max_count = 100默认最大的数是100count = [0 for _ in range(max_count+1)]for val in li:count[val] += 1li.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)

桶排序

时间复杂度较难讨论

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

python"># 桶排序  不重要
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 = 99bucket[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:breaksorted_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))

基数排序

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

基数排序的实现

python"># 基数排序的实现
# 时间复杂度O(kn)(k表示数字位数)
def radix_sort(li):max_num = max(li)      # 最大值9—>1次分桶,99->2,888->3,10000->5it = 0while 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=9digit = (var//10**it) % 10buckets[digit].append(var)li.clear()for buc in buckets:li.extend(buc)it += 1import random
li = list(range(1000))
random.shuffle(li)
radix_sort(li)
print(li)


http://www.ppmy.cn/news/1559547.html

相关文章

基于c语言的union、字符串、格式化输入输出

结构体之共用体union 共用体也叫联合体&#xff0c;其关键词为union 与结构体不同的是&#xff0c;共用体所开辟的存储空间仅仅为其中最长类型变量的存储空间而不是全部变量的存储空间&#xff0c;由于同一内存单元在同一时间内只能存放其中一种的数据类型&#xff0c;因此在每…

评分模型在路网通勤习惯分析中的应用——提出问题(1)

1、问题的由来、目标和意义 最近一段时间和公司其它业务部门讨论时&#xff0c;发现一个有趣的交通路网问题&#xff0c;车辆从S点行驶到V点共用时40分钟&#xff0c;这段时间内路网中的卡口摄像头识别到了车辆通过的信息。如下图所示&#xff1a; 设计师需要通过这些有限的路…

OCR实践-Table-Transformer

前言 书接上文 OCR实践—PaddleOCR Table-Transformer 与 PubTables-1M table-transformer&#xff0c;来自微软&#xff0c;基于Detr&#xff0c;在PubTables1M 数据集上进行训练&#xff0c;模型是在提出数据集同时的工作&#xff0c; paper PubTables-1M: Towards comp…

# 光速上手 - JPA 原生 sql DTO 投影

前言 使用 JPA 时&#xff0c;我们一般通过 Entity 进行实体类映射&#xff0c;从数据库中查询出对象。然而&#xff0c;在实际开发中&#xff0c;有时需要自定义查询结果并将其直接映射到 DTO&#xff0c;而不是实体类。这种需求可以通过 JPA 原生 SQL 查询和 DTO 投影 来实现…

Flink如何处理迟到数据?

在flink中进行窗口计算时&#xff0c;由于乱序流数据的问题&#xff0c;往往会出现迟到数据&#xff0c;迟到数据未参与所属窗口的计算会对计算结果的准确性产生影响&#xff0c;对此&#xff0c;Flink有如下三种方法来保障结果的准确性。 &#xff08;1&#xff09;水位线的延…

Redis可视化工具 RDM mac安装使用

第一步&#xff1a;https://pan.baidu.com/s/10vpdhw7YfDD7G4yZCGtqQg?at1673701651004将dmg下载 第二部&#xff1a;点击下载的dmg文件进行安装、mac可能会提示&#xff1a; 无法验证此App不包含恶意软件 解决方法&#xff1a; 打开系统偏好设置>安全性与隐私>通用&am…

Qt仿音乐播放器:绘画、图片

一、铺垫 1.Qt中给程序员提供的组件&#xff0c;基本上都是矩形&#xff0c;那如果程序员想画一个三角形和圆形&#xff1b;那就必须要使用绘画类&#xff1b; 二、绘画 注意&#xff1a;关于 paintEvent&#xff1a;paintEvent 会在以下情况下被触发: 1.控件⾸次创建. 2.控…

FFmpeg来从HTTP拉取流并实时推流到RTMP服务器

当使用FFmpeg来从HTTP拉取流并实时推流到RTMP服务器时&#xff0c;你可以使用以下命令&#xff1a; ffmpeg -i http://输入流地址 -c:v copy -c:a copy -f flv rtmp://RTMP服务器地址/应用名称/流名称 这是一个基本的命令示例&#xff0c;其中&#xff1a; - -i http://输入流地…