用Python动态展示排序算法
文章目录
- 选择冒泡
- 插入排序
- 归并排序
- 希尔排序
经常看到这种算法可视化的图片,但往往做不到和画图的人心灵相通,所以想自己画一下,本文主要实现归并排序和希尔排序,如果想实现其他算法可参考这篇
C语言实现各种排序算法[选择,冒泡,插入,归并,希尔,快排,堆排序,计数]
选择冒泡
这两种排序方案简单到很难说是什么算法,其中选择排序通过遍历一次数组,选出其中最大(小)的值放在新数组的第一位,再从剩下的数里选出最大(小)的,放到第二位,依次类推;冒泡排序则是通过重复走访要排序的数组,比较相邻元素,如果顺序不符合要求则交换位置,直到不需要交换为止。
| 选择排序 | 冒泡排序 |
|---|---|
![]() | ![]() |
二者的核心代码分别为:
#x为待排序列表,N=len(x)
#选择排序
for i in range(N):iMax = ifor j in range(i, N):if(x[j]>x[iMax]):iMax = jx[iMax],x[i] = x[i],x[iMax]#冒泡排序
tempN = N-1
for i in range(tempN):for j in range(0, tempN-i):if(x[j]>x[j+1]):x[j],x[j+1] = x[j+1],x[j]
下面给出选择排序的绘图代码,其他的所有排序算法,其实只需改变核心部分。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation start,end,N = 10,100,9
x = np.random.randint(start, end, size=N)
Index = np.arange(N)
xs = []
nowIndex = []for i in range(N):iMax = ifor j in range(i, N):xs.append(x*1) #存储当前顺序,用于绘图nowIndex.append([i,j,iMax]) #存储当前的i,j,max位置,用于绘图if(x[j]>x[iMax]):iMax = jxs.append(x*1)nowIndex.append([i,j,iMax])x[iMax],x[i] = x[i],x[iMax]fig, ax = plt.subplots()
colors = np.repeat('g',N)
colors[0] = 'b'
bar = ax.bar(Index,x,color=colors)def animate(n):data = xs[n]colors = np.repeat('gray',N)colors[nowIndex[n]] = 'b','g','r'ax.clear()bar = ax.bar(Index, data, color=colors)return barani = animation.FuncAnimation(fig, animate, range(len(xs)), interval=500, repeat=False, blit=True)
plt.show()
ani.save("sort.gif")
插入排序
插入排序的基本思路是将数组分为前后两个部分,前面有序,后面无序。逐个扫描无序数组,将每次扫描的数插入到有序数组中,从而有序数组越来越长,无序数组越来越短,直到整个数组都是有序的。
核心代码为
for i in range(1,N):j = i-1temp = x[i]while(x[i]<x[j] and j>=0):x[j+1] = x[j]j -= 1x[j+1] = temp
由于在这段代码中, x i x_i xi被取出放在旁边,所以其动态图中大部分时间会缺失一个值,在图中将其置于最右侧,其动态过程如图所示,蓝色表示抽出来准备插进去的那根bar

归并排序
排序算法到这里才算有点意思,归并排序是算法导论中介绍分治概念时提到的,基本思路是将数组拆分成子数组,然后令子数组有序,再令数组之间有序,从而整个数组有序。
算法步骤 \textbf{算法步骤} 算法步骤
设数组有 n n n个元素, { a 0 , a 1 , … , a n } \{a_0,a_1,\ldots,a_n\} {a0,a1,…,an}
- 如果数组元素大于2,则将数组分成左数组和右数组,如果数组等于2,则将数组转成有序数组
- 对左数组和右数组执行1操作。
- 合并左数组和右数组。
可以发现,对长度为 n n n的数组,需要 log 2 n \log_2n log2n次的拆分,每个拆分层级都有 O ( n ) O(n) O(n)的时间复杂度和 O ( n ) O(n) O(n)的空间复杂度,所以其时间复杂度和空间复杂度分别为 O ( n log 2 n ) 和 O ( n ) O(n\log_2n)和O(n) O(nlog2n)和O(n)。
其核心算法为
def Merge(X, Y):nL,nR = len(X), len(Y)iterL,iterR = 0,0xNew = []for _ in range(nL+nR):if(iterL==nL): return xNew + Y[iterR:]if(iterR==nR): return xNew + X[iterL:]if(X[iterL]<Y[iterR]):xNew.append(X[iterL])iterL += 1else:xNew.append(Y[iterR])iterR += 1return xNewdef MergeSort(x):if len(x)==1:return xif len(x)==2:return x if x[0]<x[1] else [x[1],x[0]]nL = len(x)//2return Merge(MergeSort(x[:nL]),MergeSort(x[nL:]))
当然这么写效率是非常低的,如果像高效还是得用指针,但我都已经用Python了,所以就不去想效率的问题,问题的关键是这种带有返回值的递归程序根本没法画图啊。。。所以还是改成指针的写法
def Merge(X, nL):nR = len(X)-nLXL,XR = X[:nL]*1,X[nL:]*1iterL,iterR = 0,0for i in range(nL+nR):if(iterL==nL): breakif(iterR==nR): X[i:] = XL[iterL:]returnif(XL[iterL]<XR[iterR]):X[i] = XL[iterL]iterL += 1else:X[i] = XR[iterR]iterR += 1def MergeSort(X):if len(X)<2:returnnL = len(X)//2MergeSort(X[:nL])MergeSort(X[nL:])Merge(X,nL)
这个图。。怎么说呢,因为在【Merge】过程中,有很多bar被掩盖掉了,所以可能只有画图的人能看懂吧。。。

希尔排序
据说是第一个突破 O ( n 2 ) O(n^2) O(n2)的排序算法,又称为缩小增量排序,本质上也是一种分治方案。
在归并排序中,先将长度为n的数组划分为nL和nR两部分,然后继续划分,直到每个数组的长度不大于2,再对每个不大于2的数组进行排序。这样,每个子数组内部有序而整体无序,然后将有序的数组进行回溯重组,直到重新变成长度为n的数组为止。
希尔排序反其道而行之,在将数组划分为nL和nR后,对nL和nR进行按位排序,使得nL和nR内部无序,但整体有序。然后再将数组进行细分,当数组长度变成1的时候,内部也就谈不上无序了,而所有长度为1的数组整体有序,也就是说有这些子数组所组成的数组是有序的。
算法步骤 \textbf{算法步骤} 算法步骤
设数组有 n n n个元素, { a 0 , a 1 , … , a n } \{a_0,a_1,\ldots,a_n\} {a0,a1,…,an}
- 如果数组元素大于2,则将数组分成左数组和右数组,并对左数组和右数组的元素进行一对一地排序。
- 对每一个数组进行细分,然后将每个子数组进行一对一排序。
def ShellSort(arr):n = len(arr)nSub = n//2while nSub>0:for i in range(nSub,n):temp = arr[i]j = i-nSubwhile j>=0 and temp<arr[j]:arr[j+nSub] = arr[j]j -= nSubarr[j+nSub] = tempnSub //= 2

相关文章:
用Python动态展示排序算法
文章目录 选择冒泡插入排序归并排序希尔排序 经常看到这种算法可视化的图片,但往往做不到和画图的人心灵相通,所以想自己画一下,本文主要实现归并排序和希尔排序,如果想实现其他算法可参考这篇 C语言实现各种排序算法[选择&#x…...
vscode代码快捷键
1、 log console.log()2、edf export default (first)>{ second } 或者 export default function(params)>{ }可以使用tab键切换修改项 3、ednf export default function first(second) {third}4、! 生成html模板 5、div#app <div id"app"></di…...
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
形参带默认值的函数 1.给默认值的时候从右向左给。 2.定义出可以给形参默认值,声明也可以给形参默认值。 3.形参默认值只能出现一次。 4.参数调用的效率问题 #sum(10,20)对应了五条汇编指令 mov eax,dword ptr[ebp-8] push eax mov ecx dword ptr[ebp-4] push …...
Linux 目录结构结构
Linux 目录结构结构 概念 Linux 没有 C、D、E...盘符,只有一个目录树。通过挂载,将不同的磁盘挂载到目录树下,通过目录访问磁盘。 不同目录的作用 目录存放内容/作用/根目录,目录树的起点,存放所有文件。…...
C++基础入门:掌握核心概念(超全!)
C作为一门广泛使用的编程语言,以其高性能和灵活性在软件开发领域占据重要地位。无论是游戏开发、系统编程还是实时应用,C都是一个不可或缺的工具。本博客旨在为初学者提供C编程语言的核心概念,帮助你建立坚实的基础。 C关键字 C关键字是编程…...
Linux第47步_安装支持linux的第三方库和mkimage工具
安装支持linux的第三方库和mkimage工具,做好移植前的准备工作。 编译linux内核之前,需要先在 ubuntu上安装“lzop库”和“libssl-dev库”,否则内核编译会失败。 mkimage工具会在zImage镜像文件的前面添加0x40个字节的头部信息,就可以得到uI…...
数据工程工程师学习路线图
数据工程岗位要求 Skill Sets required: - Hands on experience enabling data via Adobe Analytics and/or Google Analytics - Understanding of how customer level data is captured and stitched with behavioural data - Experience working with Testing (QA) and D…...
MySQL主从同步与分库分表
分库分表...
百度PaddleOCR字符识别推理部署(C++)
1 环境 1.opencv(https://sourceforge.net/projects/opencvlibrary/) 2.cmake(https://cmake.org/download/) 3.vs2019((https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.1) 4.paddleOCR项目-建议2.0(http…...
C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示
对上一篇的工作C学习笔记 | 基于Qt框架开发实时成绩显示排序系统1-CSDN博客继续优化,增加一个显示运动员每组成绩的折线图。 1)在Qt Creator的项目文件(.pro文件)中添加对Qt Charts模块的支持: QT charts 2…...
Microsoft Excel 加载数据分析工具
Microsoft Excel 加载数据分析工具 1. 打开 Excel,文件 -> 选项2. 加载项 -> 转到…3. 分析工具库、分析工具库 - VBA4. 打开 Excel,数据 -> 数据分析References 1. 打开 Excel,文件 -> 选项 2. 加载项 -> 转到… 3…...
Day32 贪心算法part02
买卖股票的最佳时机 太牛了我,随随便便双指针秒杀 md题解里面双指针都没用直接for循环秒杀 跳跃游戏 写成这样纯粹是没有看到第一次跳跃必须从第一个开始 class Solution:def canJump(self, nums: List[int]) -> bool:if len(nums) 1:return Truefor i in …...
3分钟带你了解Vue3的nextTick()
前言 Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。简单来说,Vue在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新ÿ…...
数据库的使用方法
sqlite3 API: 头文件: #include <sqlite3.h> 编译时候要加上-lsqlite3 gcc a.c -lsqlite3 1)sqlite3_open int sqlite3_open(const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db …...
HTML5和CSS3强化知识总结
HTML5的新特性 HTML5的新增特性主要是针对于以前的不足,增一些新的标签、新的表单和新的表单属性等。这些新特性都有兼容性问题,基本是IE9以上版本的浏览器才支持,如果不考虑兼容性问题,可以大量使用这些新特性。 HTML5新增的语义…...
华为机考入门python3--(13)牛客13-句子逆序
分类:列表 知识点: 列表逆序(和字符串逆序是一样的) my_list[::-1] 题目来自【牛客】 def reverse_sentence(sentence): # 将输入的句子分割words sentence.split() # 将单词逆序排列 words words[::-1] # 将单词用空…...
javaScript实现客户端直连AWS S3(亚马逊云)文件上传、断点续传、断网重传
写在前面:在做这个调研时我遇到的需求是前端直接对接亚马逊平台实现文件上传功能。上传视频文件通常十几个G、客户工作环境网络较差KB/s,且保证上传是稳定的,支持网络异常断点重试、文件断开支持二次拖入自动重传等。综合考虑使用的Aws S3的分…...
从基建发力,CESS 如何推动 RWA 发展?
2023 年 11 月 30 日,Web3 基金会(Web3 Foundation)宣布通过 Centrifuge 将部分资金投资于 RWA(Real World Assets,真实世界资产),试点投资为 100 万美元。Web3 基金会旨在通过支持专注于隐私、…...
qml写一个自适应登录框
1、前言 写一个可自由伸缩的登录框,,(横向上) 关键:给相关控件赋予 Layout.fillWidth: true 属性 即可。 2、代码 //main.qml import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQml 2.12 import QtQuic…...
考研高数(导数的定义)
总结: 导数的本质就是极限。 函数在某点可导就必连续,连续就有极限且等于该点的函数值。 例题1:(归结原则的条件是函数可导) 例题2: 例题3:...
从‘秦皇岛今天晴空万里’到HMM:一文搞懂NLP分词中的序列标注到底在标什么
从天气报告到智能分词:解码序列标注在NLP中的魔法 秦皇岛的晴空万里不仅是气象术语,更是理解自然语言处理(NLP)中序列标注技术的绝佳入口。当我们看到"秦皇岛今天晴空万里"这行文字时,人脑能瞬间将其分解为有意义的词汇单元&#x…...
轻松解包网易游戏资源:unnpk工具完整使用指南
轻松解包网易游戏资源:unnpk工具完整使用指南 【免费下载链接】unnpk 解包网易游戏NeoX引擎NPK文件,如阴阳师、魔法禁书目录。 项目地址: https://gitcode.com/gh_mirrors/un/unnpk 想要探索网易游戏如《阴阳师》、《魔法禁书目录》中的精美角色立…...
技术博主都在悄悄用的Perplexity高级搜索语法,11个未公开符号组合全曝光
更多请点击: https://kaifayun.com 第一章:Perplexity高级搜索语法的底层逻辑与设计哲学 Perplexity 的高级搜索语法并非简单的关键词匹配扩展,而是基于语义意图建模与查询图谱重构的设计实践。其核心在于将用户自然语言查询实时编译为可执行…...
理解“变异”的奥秘——集中趋势与变异性度量详解
如果说统计学是在“用数据讲故事”,那么集中趋势回答的是:“这个故事大概讲到了哪里?”而变异性回答的是:“这个故事有多分散、多不稳定、多不一样?”很多初学者学统计时,最先记住的是“平均数”“中位数”…...
手把手教你用Spark MLlib搞定协同过滤:从ItemCF到UserCF的保姆级代码解析
Spark MLlib实战:从协同过滤到深度学习推荐系统的全链路实现 推荐系统作为机器学习领域最具商业价值的应用之一,其核心算法在Spark生态中有着丰富的实现。本文将带您深入Spark MLlib的推荐算法实践,从经典的协同过滤到前沿的深度学习模型&…...
避开HAL库:STM32F103寄存器级PWM移相全桥配置避坑指南
STM32F103寄存器级PWM移相全桥实战:从原理到避坑指南 在嵌入式开发领域,许多工程师习惯使用HAL库或标准库进行STM32开发,这确实能提高开发效率。但当项目对时序精度、资源占用或性能有极致要求时,直接操作寄存器往往能带来更优的效…...
深度解析baidupcsapi:Python百度网盘API高级配置与实战指南
深度解析baidupcsapi:Python百度网盘API高级配置与实战指南 【免费下载链接】baidupcsapi 百度网盘api 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcsapi baidupcsapi是一个功能强大的Python百度网盘API库,为开发者提供了完整的百度网盘…...
OBS实时字幕插件实战指南:专业直播字幕解决方案
OBS实时字幕插件实战指南:专业直播字幕解决方案 【免费下载链接】OBS-captions-plugin Closed Captioning OBS plugin using Google Speech Recognition 项目地址: https://gitcode.com/gh_mirrors/ob/OBS-captions-plugin 在当今的直播和内容创作领域&#…...
QT中使用MFC的示例工程
QT中使用MFC的示例工程 【下载地址】QT中使用MFC的示例工程 本仓库提供了一个在QT中使用MFC的示例工程,展示了如何在QT项目中引入MFC库,并使用MFC中的CString类和MessageBox方法。该示例工程适用于QT4和VS2013,但同样适用于QT3、QT4、QT5以及…...
抖音视频收藏革命:从水印困扰到纯净收藏的完美蜕变
抖音视频收藏革命:从水印困扰到纯净收藏的完美蜕变 【免费下载链接】douyin_downloader 抖音短视频无水印下载 win编译版本下载:https://www.lanzous.com/i9za5od 项目地址: https://gitcode.com/gh_mirrors/dou/douyin_downloader 你是否曾经在抖…...


