Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

1、希尔排序

  • 希尔排序(shell sort)是一种分组插入排序算法
  • 首先取一个整数d1=n/2,将元素分为d1个组,每组相邻两元素之间距离为d1,在各组内进行直接插入排序
  • 取第二个整数d2=d1/2,重复上述分组排序过程,知道di=1,即所有元素在同一组内进行直接插入排序。
  • 希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序

 例如:按照距离d1=n/2,将整个列表分为4组(例子中n=9)

(1) 分别为

  • 第一组 5,3,8
  • 第二组 7,1
  • 第三组 4,2
  • 第四组 6,9

(2)  然后在组内进行插入排序

 (3)然后在取整数d2=d1/2

 (4)当d2的时候,将数组分为了两组,间隔为2的是一组,然后组内又进行插入排序

 (5)组内排序之后的结果图:

 (6)d3=d2/2,此时距离d3为1的为一组(当d3=1的时候相当于直接进行插入排序)

 (7)结果如图所示:

 (8)代码

def inseart_search_gap(list, gap):''':param list: 列表:param gap: 分的组:return:'''for i in range(gap, len(list)):temp = list[i]j = i - gapwhile j >= 0 and list[j] > temp:list[j + gap] = list[j]j -= gaplist[j + gap] = tempdef shell_sort(li):'''希尔排序'''d = len(li) // 2while d >= 1:inseart_search_gap(li, d)d //= 2

Note:

插入排序其实可以看成距离gap=1的情况

2、希尔排序的讨论

希尔排序的时间复杂度比较复杂,并且与选择的gap序列有关

 3、计数排序

  • 对列表进行排序,已知列表中的数的取值范围都在0到100之间。设计时间复杂度为O(n)的算法

# 计数排序
import randomdef count_sort(li, max_count=100):''':param li:列表:param max_count:列表中最大取值'''count = [0 for _ in range(max_count + 1)]# 表示无论我遍历到第几次,不关心当前值是多少,而是一律输出0,因为取值范围是0-100,所以在生成列表的时候,我们要考虑到101for val in li:count[val] = count[val] + 1# 清空原列表,避免新建列表li.clear()for index, value in enumerate(count):for i in range(value):li.append(index)li = [random.randint(0, 100) for _ in range(1000)]
print(li)
count_sort(li)
print(li)

Note:

  • 缺陷如下:
    • 开辟列表空间浪费资源,比如取值范围是0-100就需要列表长度为100的列表
    • 需要知道给定数据的取值范围

 4、桶排序

  • 在计数排序中,如果元素的范围比较大(比如在1到1亿之间),如何改造算法
  • 桶排序(Bucket Sort):首先将元素分在不同的桶中,在对每个桶中的元素排序

# 桶排序
def bucket_sort(li, n=100, max_number=10000):''':param li: 列表:param n: 分成多少桶:param max_number:最大取值范围'''buckets = [[] for _ in range(n)]  # 列表生成式(创建桶),例如:[[],[],[],...]for var in li:# 例如:每个桶放的范围是(max_number//n),假设var是86,那么它应该放在0号桶内,var整除(max_number//n)是0# 其中n-1表示最后一个桶,min()函数用于防止桶越界,即使数字为10000,也放入最后一个桶i = min(var // (max_number // n), n - 1)  # (表示var放到几号桶内)buckets[i].append(var)# for 循环结束元素都放入桶中for j in range(len(buckets[i]) - 1, 0, -1):  # 对第i号桶进行排序,j表示桶内最后一个元素开始,这里写0是因为前包后不包,范围到1号位置元素# [0,2,4,3] 假设放入的元素为3,需要j从最后遍历到2这个元素位置if buckets[i][j] < buckets[i][j - 1]:# 交换元素buckets[i][j], buckets[i][j - 1] = buckets[i][j - 1], buckets[i][j]else:breaksort_li = []  # 新建列表for buc in buckets:sort_li.extend(buc)  # 将一个列表加到另一个列表后面return sort_li

Note:

  • 桶排序的表现取决于数据的分布。也就是要对不同数据排序时采用不同的分桶策略
  • 平均情况时间复杂度:O(n+k)
  • 最坏情况时间复杂度:O(n^2*k)
  • 空间复杂度:O(nk)
  • 数据排序部分可以根据实际需要进行优化

5、基数排序

 (1)多关键字排序

  • 假如现在有一个员工表,要求按照薪资排序,年龄相同的员工按照年龄排序
    • 先按照年龄排序,再按照薪资进行稳定排序(稳定:相对位置不变
  • 对32,13,94,52,17,54,93进行排序,是否可以看做多关键字排序

 Note:

  • 先按照个位数分桶

 

  • 然后依次输出

  •  按照十位数分桶

  •  在依次输出

 (2)基数排序的实现

def radix_sort(li):max_num = max(li)  # max value 8->1 99->2 888->3 9999->4it = 0  # 迭代次数while 10 ** it <= max_num:buckets = [[] for _ in range(10)]for var in li:# 找某一位的数 987   it=1 取个位:987%10(取模)  it=2 取十位:987//10=98   98%10=8digit = (var // 10 ** it) % 10buckets[digit].append(var)# 分桶结束li.clear()for buc in buckets:li.extend(buc)# 重新写回liit += 1import randomli = list(range(100))
random.shuffle(li)
radix_sort(li)
print(li)

Note:

  • 时间复杂度:O(Kn)
  • 空间复杂度:O(K+n)
  • K表示数字位数

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

手把手QQ机器人制作教程,根据官方接口进行开发,基于Python语言制作的详细教程(更新中)

第 1 课、注册 QQ 开放平台账户 QQ开放平台官方地址&#xff1a;https://q.qq.com/#/app/bot QQ开放平台包含&#xff1a;QQ机器人、QQ小程序、QQ小游戏&#xff0c;我们这边选择QQ机器人。 机器人类型&#xff1a;设置私域机器人或者公域机器人&#xff0c;当然公域机器人对…

【0基础QQ机器人开发】基于go-cqhttp的QQ机器人开发教程,仅供自学

文章目录 一、本文目的:二、实现历程:三、开发过程1.准备工作1.cq-http的下载地址:[Releases Mrs4s/go-cqhttp (github.com)](https://github.com/Mrs4s/go-cqhttp/releases)2.python环境的配置 2.程序配置3.python程序开发4.常用API拓展 API 及与 OneBot 标准有略微差异的 AP…

【最新】半小时教你制作出属于自己的QQ机器人【保姆级】

目录 前言QQ机器人功能展示一、安装nonebot2安装步骤建立一个新的机器人项目 二、安装go-cqhttp安装步骤修改配置 三、使用 前言 相信大家都有在QQ群见过QQ机器人&#xff0c;可以玩游戏、推送当日天气情况等。本文将基于nonebot2和go-cqhttp构建一个自定义的QQ机器人。 QQ机…

如何在linux上使用QQ(在终端上使用qq) mojo-qq

如何在linux终端上使用QQ 效果展示 介绍irc irc的历史非常悠久&#xff0c;那都是上个世界别人用来聊天的了&#xff0c;算是我接触到的最早的及时聊天 以下是来自google的简介 Internet Relay Chat (IRC) is an application layer protocol that facilitates communicatio…

QQ机器人

一、介绍 qqbot 是一个用 python 实现的、基于腾讯 SmartQQ 协议的 QQ 机器人&#xff0c;可运行在 Linux 、 Windows 和 Mac OSX 平台下。 本项目 github 地址&#xff1a; https://github.com/pandolia/qqbot 你可以通过扩展 qqbot 来实现&#xff1a; 监控、收集 QQ 消息自动…

实现一个QQ助手

一、准备工作 下载go-cqhttp&#xff0c;下载自己需要的版本&#xff0c;我是在ubuntu上搭建&#xff0c;我下载的是go-cqhttp_1.0.0-bata4_linux_amd64.deb 二、流程 2.1、生成配置文件 切换到下载路径&#xff0c;并执行如下命令&#xff1a; sudo dpkg -i go-cqhttp_1.0…

基于node.js和oicq的qq机器人 制作回顾分析笔记

目录 1 文章简介 2 项目介绍 3 qq机器人的登录部分 3.1 模块的调用 3.2 登录配置文件 3.3 登录部分 4. 普通非指令功能 4.1 自动复读 4.2 自助禁言 4.3 来点颜色 4.4 回复功能 5. 指令功能 5.1 删除图片 5.2 禁言 5.3 解除禁言 5.4 查看帮助 5.5 群白名单 5.6…

浙大知识图谱基础:学习笔记

0 基础知识 知识图谱中&#xff0c;知识的结构化表示主要有符号表示和向量表示两类方法。符号表示包括&#xff1a;一阶谓词逻辑&#xff0c;语义网络&#xff0c;描述逻辑和框架系统等。当前主要采用基于图的符号化知识表示&#xff0c;最常用的是有向标记图。 有向标记图分为…

识别在线视频中的歌曲并下载音乐

问题&#xff1a;视频中的歌曲觉得很好听&#xff0c;但又不知道是什么歌曲&#xff0c;如何解决&#xff1f; 1、在chrome商店中找到aha music 插件。 2、安装. 3、打开需要识别的视频网站&#xff0c;点击aha music按钮。 4、当找到该歌曲时&#xff0c;点击。 5、按F12 在…

小程序简单实现搜歌、听歌

这篇文章用了两个网易云音乐的接口&#xff08;不清楚是否是官方的&#xff09;&#xff0c;附上官方接口链接: 网易云音乐API / 本文所用接口&#xff1a; 1、http://musicapi.leanapp.cn/search 2、http://neteasecloudmusicapi.zhaoboy.com/song/url 效果图 相关代码如下 先…

java爬虫爬取音乐

以前写过一个音乐网站&#xff0c;我都是手动去下载音乐&#xff0c;并上传到网站&#xff0c;非常麻烦。 学习了HttpClinet和Jsoup 我决定完成一个简单的爬虫去收集音乐信息&#xff0c;并下载音乐&#xff1b; 先尝试做几个简单的小功能&#xff1a; 基本功能 1.根据歌曲…

计算机上面的音乐,电脑上如何识别音乐

电脑上如何识别音乐 我们都知道怎么在手机上使用软件来实现识别音乐的功能&#xff0c;但是在网上怎么识别呢。那么电脑上如何识别音乐呢?下面就让jy135小编来告诉大家吧&#xff0c;欢迎阅读。 首先打开midomi网站(http://www.midomi.com/) 见下图 点击网站上的“Click and S…

python音乐爬取

思路 本次爬取音乐使用reqursts模块&#xff0c;在安装此模块的基础上爬取音乐。 首先要获取抓包链接&#xff0c;这是一串网址&#xff0c;获取方法就是当你在浏览器界面播放音乐时打开开发者界面寻取。其次使用get()向服务器发送get请求 .content获取二进制数据。最后将此写入…

Spring AOP简介及相关案例

目录 一、Spring AOP简介 二、AOP相关术语 三、AOP入门案例 1. 引入依赖 2. 编写连接点 3. 编写通知类 4. 配置切面 5. 测试 四、通知类型 1. 编写通知方法 2. 配置切面 3. 测试 五、切点表达式 六、多切面配置 1. 编写发送邮件的通知 2. 配置切面 3. 测试 …

Java与数据库:JDBC和ORM框架的使用和效率优化

第一章&#xff1a;引言 随着互联网的快速发展和大数据时代的到来&#xff0c;数据库在软件开发中起到了至关重要的作用。Java作为一门强大而广泛应用的编程语言&#xff0c;提供了多种与数据库交互的方式。其中&#xff0c;JDBC和ORM框架是最常用的两种方式。本文将深入探讨J…

适合打游戏用的蓝牙耳机有哪些?吃鸡无延迟的蓝牙耳机推荐

现在手游的兴起&#xff0c;让游戏市场变得更加火爆&#xff0c;各种可以提高玩家体验的外设也越来越多&#xff0c;除了提升操作的外置按键与手柄外&#xff0c;能带来更出色音质与舒心使用的游戏耳机&#xff0c;整体氛围感更好&#xff0c;让玩家在细节上占据优势&#xff0…

打游戏的蓝牙耳机推荐哪一款?吃鸡蓝牙游戏耳机推荐

选倒一款好的蓝牙耳机&#xff0c;即可以享受美妙音乐&#xff0c;也可以沉浸于深度游戏体验之中&#xff0c;能够让自己的身心压力得到释放。不过呢&#xff0c;最近发现很多人在买蓝牙耳机的时候都不知道怎么选一款靠谱的产品。作为已有5年多玩机经验的爱好者&#xff0c;今天…

即兴演讲、怎么锻炼即兴演讲能力、一些即兴演讲的模板

文章目录 应有素质准备方法模糊性临场性 组合形式并列式正反式递进式 基本技巧举例说明**一. 散 点 联 想 法****二. 问题--原因--解决方案****三. 感谢--回顾--愿景****四. 观 音 按 揭 法****五. 黄 金 三 点 法****六. 总 结****1. 五个名称-锻炼你的大脑快速反应能力****2.…

String字符串

文章目录 String类String常用的字符串处理方法StringBuffer类 StringBufferStringBuffer类中常用的方法StringBuilder类&#xff08;了解为主&#xff09;StringTokenzier类&#xff08;了解为主&#xff09; final属性&#xff0c;不可扩展&#xff0c;不可子类&#xff0c;不…

在idea中创建一个SpringBoot模块

方式一&#xff1a;自动创建&#xff08;需要联网&#xff09; 第一步&#xff1a;新建模块 按住ctrlshiftalts&#xff0c;打开项目结构&#xff0c;选择新建模块&#xff1b; 第二步&#xff1a;选择Spring Web &#xff08;1&#xff09;选择SpringBoot版本&#xff0c…