其他排序(基数排序,希尔排序和桶排序)(数据结构课设篇3,python版)(排序综合)

本篇博客主要详细讲解一下其他排序(基数排序,希尔排序和桶排序)也是排序综合系列里最后一篇博客。第一篇博客讲解的是LowB三人组(冒泡排序,插入排序,选择排序)(数据结构课设篇1,python版)(排序综合),第二篇博客讲解的是NB三人组(堆排序,归并排序,快速排序)(数据结构课设篇2,python版)(排序综合)。

random和time库的用法在第一篇冒泡排序里讲解过。数据结构课设实验内容和要求也在第一篇博客中。

基数排序:

概念:

基数排序是一种非比较型的排序算法,它根据数字的位数进行排序。它首先按照个位数进行排序,然后按照十位数进行排序,以此类推,直到最高位数。基数排序适用于整数或字符串的排序。假设待排序的数据有 n 个,每个数据的位数为 d,数据的范围为 k,那么基数排序的时间复杂度可以表示为 O(d*(n+k))。基数排序的基本思想是:

  1. 根据个位数进行排序,将数据分配到0-9的桶中。
  2. 按照顺序将桶中的数据合并起来。
  3. 根据十位数进行排序,再次将数据分配到0-9的桶中。
  4. 按照顺序将桶中的数据合并起来。 依次类推,直到最高位排序完成。

如图:

在这里插入图片描述

代码及详细注释:

import random
import time
def radix_sort(li):
    max_num = max(li)  # 找到列表中的最大值
    it = 0  # 初始化迭代次数
    while 10 ** it <= max_num:  # 循环直到最高位
        buckets = [[] for _ in range(10)]  # 定义十个空桶
        for val in li:
            digit = (val // 10 ** it) % 10  # 取val的第it位数字(个位、十位、百位等)
            buckets[digit].append(val)  # 将val放入对应的桶中
        # 分桶完成
        li.clear()
        for buc in buckets:  # 将桶中的元素按顺序合并为一个列表
            li.extend(buc)
        # 把数重新写回li
        it += 1  # 迭代次数加1

li = [random.randint(1, 100000000) for i in range(10000)]
print(li)
start = time.time()
radix_sort(li)
end = time.time()
print(li)
print('运行时间:%s Seconds'%(end-start))

基数排序的思想和代码都比较好理解,详细过程注释中都有说明。

运行结果:

在这里插入图片描述

希尔排序:

概念:

希尔排序是一种插入排序的改进版本,它通过将待排序的数据分成若干个小组,分别进行插入排序,然后逐渐减少小组的数量和增加小组内元素的间隔,直到最后一次将整个数据序列作为一个小组进行插入排序。希尔排序的时间复杂度在O(nlogn)和O(n^2)之间。希尔排序的基本思想是:

  1. 首先,选择一个增量序列,例如n/2、n/4、n/8等,将待排序的数据分成若干个小组。
  2. 然后,对每个小组内的数据进行插入排序。
  3. 接着,逐渐减少增量,重复上述步骤,直到增量为1,最后进行一次插入排序。

如图:

在这里插入图片描述

代码及详细注释:

import random
import time
def insert_sort_gap(li, gap):
    for i in range(gap, len(li)):  # 从第gap个元素开始,依次向前进行插入排序
        j = i - gap  # j指向当前元素的前一个元素
        tmp = li[i]  # 记录当前元素的值
        while j >= 0 and li[j] > tmp:  # 如果前面的元素比当前元素大
            li[j + gap] = li[j]  # 将前面的元素后移gap位
            j -= gap  # 继续向前寻找插入位置
        li[j + gap] = tmp  # 插入当前元素到正确的位置
def shell_sort(li):
    d = len(li) // 2  # 初始步长取数组长度的一半
    while d >= 1:
        insert_sort_gap(li, d)  # 对每个步长进行插入排序
        d //= 2  # 步长减半

li = [random.randint(1, 100000000) for i in range(100000)]
print(li)
start = time.time()
shell_sort(li)
end = time.time()
print(li)
print('运行时间:%s Seconds'%(end-start))

希尔排序的思路和代码也是比较好理解和实现的,注释里讲解的还是比较详细的。

运行结果:

在这里插入图片描述

桶排序:

概念:

桶排序是一种排序算法,它将待排序的数据分成若干个桶,然后对每个桶内的数据进行排序,最后将所有桶内的数据按照顺序合并起来。桶排序适用于待排序的数据分布比较均匀的情况下。

桶排序的时间复杂度取决于使用的排序算法和桶的数量。在最理想的情况下,桶排序的时间复杂度为O(n+k),其中n是待排序元素的数量,k是桶的数量。这是因为在最理想的情况下,每个桶中的元素都是均匀分布的,因此每个桶内的排序所需的时间是O(1)。然而,在最坏的情况下,所有元素都被放入同一个桶中,此时桶排序的时间复杂度将变为O(nlogn),这是因为在这种情况下需要使用其他的排序算法对桶内的元素进行排序。
桶排序的基本思想是:

  1. 首先,确定桶的数量,并将待排序的数据分配到对应的桶中。
  2. 然后,对每个桶内的数据进行排序,可以使用任何一种排序算法,通常使用插入排序或者快速排序。
  3. 最后,按照桶的顺序将所有桶内的数据合并起来。

如图:

在这里插入图片描述

代码及详细注释:

import random
import time
def bucket_sort(li, n=100, max_num=10000):
    buckets = [[] for _ in range(n)]  # 创建n个空桶
    for val in li:
        i = min(val // (max_num // n), n - 1)  # 计算val应该放到哪个桶里
        buckets[i].append(val)  # 将val加入对应的桶中
        # 保持桶内的顺序
        for j in range(len(buckets[i]) - 1, 0, -1):  # 对桶内元素进行排序
            if buckets[i][j] < buckets[i][j - 1]:  # 如果当前元素比前一个元素小
                buckets[i][j], buckets[i][j - 1] = buckets[i][j - 1], buckets[i][j]  # 交换两个元素的位置
            else:
                break  # 如果当前元素大于等于前一个元素,则停止排序
    sorted_li = []
    for buc in buckets:  # 将所有桶中的元素按顺序合并为一个列表
        sorted_li.extend(buc)
    return sorted_li  # 返回排序后的列表

li = [random.randint(1, 100000000) for i in range(10000)]
print(li)
start = time.time()
bucket_sort(li)
end = time.time()
print(li)
print('运行时间:%s Seconds'%(end-start))

运行结果:

在这里插入图片描述

总结:

至此排序综合系列讲解完毕,排序综合1讲解了LowB三人组(冒泡排序,插入排序,选择排序)(数据结构课设篇1,python版)(排序综合),排序综合2讲解了NB三人组(堆排序,归并排序,快速排序)(数据结构课设篇2,python版)(排序综合)。这些也是数据结构的课设之一,大家可以借鉴参考一下。总体来说排序的思路和代码还是相对与其他算法好理解和实现的
在这里我也给大家对所有讲过的排序进行一个运行效率上的比较(不是通过时间复杂度而是通过运行结果),在此之前每个排序我都对好几组不同内容和不同规模大小的数组进行排序运行,最后得出的结果是:桶排序和冒泡排序最慢,其次是插入排序和选择排序,再次是希尔排序,最后是基数排序,堆排序,归并排序和快速排序(其中基数排序在大规模运算下效率高,运行时间最短)如有不对,欢迎指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/299439.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】深入了解构造函数之初始化列表

目录 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 2&#xff09;不同成员变量赋值 2、初始化列表 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值…

勇哥带您手搓一个信息发布系统CMS(3)--抽象栏目模板设计

目录 引言 一、栏目数据库设计。 二、Controller层方法设计 引言 在CMS开发过程中&#xff0c;一般如果采用thymeleaf开发&#xff0c;那就需要每一个页面配一个Controller中的方法指定页面&#xff0c;但是这样就会导致Controller中的方法非常多&#xff0c;而且也会破坏C…

yarn -v和vue -V报错环境变量配置

node官网下载安装好node后&#xff0c;node-v npm-v查看版本号&#xff0c;安装好node后会自动安装好npm和配置好全局环境变量 全局安装 yarn npm i yarn -g 查看是否安装成功 yarn -v 安装 vue/cli yarn global add vue/cli 查看是否安装成功 vue -V 或vue --version 如果…

STL——deque详解

目录 &#x1f4a1;基本概念 &#x1f4a1;deque构造函数 &#x1f4a1;deque赋值操作 &#x1f4a1;deque大小 &#x1f4a1;deque插入和删除 &#x1f4a1;deque数据存取 &#x1f4a1;deque排序 &#x1f4a1;基本概念 功能: 双端数组&#xff0c;可以对头端进行插入删…

VmWare虚拟机的安装

VmWare官方最新版下载地址 vmware官方下载地址 安装流程 安装成功验证 安装完成之后&#xff0c;打开网络中心&#xff0c;一定要确认这里多出两个网络连接&#xff0c;才证明Vmware已经安装成功

Kali Linux——获取root权限

目录 一、设置root密码 【操作命令】 【操作实例】 二、临时获取root权限 【操作命令】 【操作实例】 三、提升用户到root 1、获取root权限 2、进入/etc/passwd 3、查看root账号ID 4、找到需要修改的用户 5、输入i&#xff0c;进入编辑模式 6、把用户的ID改成跟r…

【好书推荐-第二期】《实战AI大模型 》:带你走进大模型GPTs、AIGC的世界(李开复、周鸿祎、颜水成倾力推荐)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

数据结构c语言版:顺序表

顺序表的定义 顺序表是一种线性数据结构&#xff0c;它由一组连续的存储单元组成&#xff0c;用来存储具有相同数据类型的元素。顺序表中的元素按照逻辑顺序依次存放&#xff0c;并且可以通过索引来访问和修改元素。 顺序表的实现方式 两种&#xff1a;静态顺序表和动态顺序表。…

华为mstp、vrrp、ospf、isis、bgp等综合一起排错

最终实现左边私网和右边私网全部ping通 SW1 vlan batch 12 34 stp region-configuration //mstp配置 region-name test instance 12 vlan 12 instance 34 vlan 34 active region-configuration interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass …

基于 Python+Neo4j+医药数据,构建了一个知识图谱的自动问答系统

知识图谱是目前自然语言处理的一个热门方向。目前知识图谱在各个领域全面开花&#xff0c;如教育、医疗、司法、金融等。 本项目立足医药领域&#xff0c;以垂直型医药网站为数据来源&#xff0c;以疾病为核心&#xff0c;构建起一个包含7类规模为4.4万的知识实体&#xff0c;…

Apifox使用外部文件完成接口预处理

pm.executeAsync(filePath, args, options) filePath string 外部程序路径 args string[] 参数。调用 jar 包中的指定方法时&#xff0c;会使用 JSON.stringify 进行转换。除此之外非 >string 类型会进行隐式类型转换自动转换为 string 类型。 options Object command str…

数据结构期末模拟试卷

一、判断题 1.关键路径是AOE网中从源点到汇点的最短路径。&#xff08;F&#xff09; 在AOE网中&#xff0c;从源点到汇点最长的路径称为关键路径&#xff0c;在关键路径上的活动称为关键活动 2. 二叉排序树的查找效率和二叉排序树的髙度有关。&#xff08;T&#xff09; 最好…

【ARM 处理器】程序存储详解

本篇文章主要介绍ARM处理器&#xff0c;Code, RO-data,RW-data,ZI-data 知识以及程序存储情况 目录 1. 专业词汇2. 程序存储3. 程序空间计算 1. 专业词汇 Code &#xff1a; 代码区&#xff0c;存储在 ROM 区域RO-data&#xff1a;Read Only data&#xff0c;即只读数据域&…

TIA Portal 各版本安装指南

TIA Portal下载链接 https://pan.baidu.com/s/1Jat53vGz1rXfLm7kTldz-Q?pwd0531 1.鼠标右击【TIA portal V19 (64bit)】压缩包&#xff08;先点击“显示更多选项”&#xff09;选择【解压到 TIA portal V19 (64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【NoRestart…

windows 部署zlm

安装 双击下面的文件&#xff0c;进行安装 查看服务是否安装成功 在任务栏右键&#xff0c;选择任务管理器 选择服务&#xff0c;打开服务 显示正在运行 查看推流密钥

应用层

title: 应用层 date: 2023-12-20 21:03:48 tags: 知识总结 categories: 计算机网络 应用层&#xff1a;负责最直观的应用请求的封装、发起 一、域名系统DNS 连接在互联网上的主机不仅有IP地址&#xff0c;还有便于用户记忆的主机名字。域名系统DNS能够把互联网上的主机的名字…

软件测试作业‖若依系统的自动化+性能

以若依系统或者任意系统作为案例&#xff0c;题目:以某一 web系统为测试对象&#xff0c;完成以下文档的编写: (1)产品规格说明书(SPEC) 要求:功能完整(完成产品需求70%以上)、UI优良(每个页 面均有字段约束和合理的出错提示)、流程完整(一一对应功能)、流程合理(处理逻辑非…

C++笔记之cout高亮输出以及纯C++实现一个彩色时钟

C笔记之cout高亮输出以及纯C实现一个彩色时钟 code review! 文章目录 C\笔记之cout高亮输出以及纯C\实现一个彩色时钟一.cout高亮输出1.1.运行1.2.代码一1.3.代码二1.4.重置终端的文本格式到默认设置说明 二.纯C\实现一个彩色时钟2.1.运行2.2.main.cc2.3.cout带颜色打印输出技…

用通俗易懂的方式讲解:万字长文带你入门大模型

告别2023&#xff0c;迎接2024。大模型技术已成为业界关注焦点&#xff0c;你是否也渴望掌握这一领域却又不知从何学起&#xff1f; 本篇文章将特别针对入门新手&#xff0c;以浅显易懂的方式梳理大模型的发展历程、核心网络结构以及数据微调等关键技术。 如果你在阅读中收获…

常用Python自动化测试框架有哪些?

随着技术的进步和自动化技术的出现&#xff0c;市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整&#xff0c;这些自动化测试框架就能够开箱即用&#xff0c;大大节省了测试时间。而且由于这些框架被广泛使用&#xff0c;他们具有很好的健壮性&#xff0…
最新文章