3分钟快速实现:9种经典排序算法的可视化

最近在某网站上看到一个视频,是关于排序算法的可视化的,看着挺有意思的,也特别喜感。

6分钟演示15种排序算法

附上源码链接:

(觉得不错,记得帮忙点个star哦)

下面具体讲解以下实现的思路,大概需要解决的问题如下:

一、如何表示数组

二、如何得到随机采样数组,数组有无重复数据

假设我希望数组长度是100,而且我希望数组的大小也是在[0,100)内,那么如何得到100个随机的整数呢?可以用random库。

示例代码:

importrandomdata=list(range(100))data=random.choices(data,k=100)print(data)[52,33,45,33,48,25,68,28,78,23,78,35,24,44,69,88,66,29,82,77,84,12,19,10,27,24,57,42,71,75,25,1,77,94,44,81,86,62,25,69,97,86,56,47,31,51,40,21,41,21,17,56,88,41,92,46,56,80,23,70,49,96,83,54,16,36,82,24,68,60,16,98,16,81,10,13,11,24,68,35,56,39,23,44,6,30,3,60,56,66,38,28,47,47,25,90,89,38,68,21]

但是以上代码有个问题,random.choices是对一个序列进行重复采样,得到的数组存在重复数据,那如果不希望存在重复数据,而是希望进行无重复采样,怎么办?

可以用random.sample函数,示例代码:

data=random.sample(data,k=100)print(data)[49,28,56,28,44,62,81,25,48,33,54,38,30,16,13,19,23,56,60,66,41,24,68,68,77,92,78,24,66,3,80,94,78,41,84,88,21,56,25,25,75,24,38,82,31,52,23,10,71,40,27,46,33,35,56,51,1,23,12,25,89,16,21,21,11,42,47,44,81,35,86,88,29,36,77,16,39,6,57,69,96,68,24,86,97,90,69,10,68,98,56,44,83,47,70,17,47,82,60,45]

这样就可以得到无重复采样数据了。

三、如何实现排序算法

算法种类较多,就不一一举例;再次就以希尔排序(ShellSort)为例讲讲:

尔排序的原理:希尔排序(ShellSort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

基础的插入法排序是两重循环,希尔排序是三重循环,最外面一重循环,控制增量gap,并逐步减少gap的值。二重循环从下标为gap的元素开始比较,依次逐个跨组处理。最后一重循环是对组内的元素进行插入法排序。这样进行排序的优点在于每次循环,整个序列的元素都将小元素的值逐步向前移动,数值比较大的值向后移动。

fromdataimportDataSeqdefShellSort(ds):assertisinstance(ds,DataSeq),"TypeError"Length=ds.lengthD=Length//2whileD>0:i=0whilei=1andds.data[j-D]>tmp:ds.SetVal(j,ds.data[j-D])j-=Dds.SetVal(j,tmp)i+=DD//=2if__name__=="__main__":ds=DataSeq(64)ds.Visualize()ds.StartTimer()ShellSort(ds)ds.StopTimer()ds.SetTimeInterval(0)ds.Visualize()

四、如何把数组可视化出来

有了随机数组初始化方法,再实现好排序函数,我们还差一步,就是把排序函数中每次移动数组后将数组可视化并输出。

对数组进行可视化,很容易想到Python的可视化工具matplotlib!但是在项目中我并没有用matplotlib,而是用了numpy+opencv。

为什么不用matplotlib?

因为在排序过程中,每次修改数组,都希望能够实时修改图片并输出,matplotlib确实很方便,但是matplotlib的效率实在是不高,而且每次修改数组前后的两幅图片其实是差不多的。如果用matplotlib,每次都是要重新绘制图片,非常耗时!!!

所以考虑自己生成图片,在每次修改数组后,只将图片中改动的那两列进行修改即可!这样就比用matplotlib每次重新绘制图片效率高得多!

数组中主要有两种操作,一种是对某个idx赋值,一种是交换某两个idx的值。

classDataSeq:WHITE=(255,255,255)RED=(0,0,255)BLACK=(0,0,0)YELLOW=(0,127,255)def__init__(self,Length,time_interval=1,sort_title="Figure",repeatition=False):passdefGetfigure(self):_bar_width=5figure=np.full((self.length*_bar_width,self.length*_bar_width,3),255,dtype=np.uint8)foriinrange(self.length):val=self.data[i]figure[-1-val*_bar_width:,i*_bar_width:i*_bar_width+_bar_width]=self.GetColor(val,self.length)self._bar_width=_bar_widthself.figure=figuredef_set_figure(self,idx,val):min_col=idx*self._bar_widthmax_col=min_col+self._bar_widthmin_row=-1-val*self._bar_widthself.figure[:,min_col:max_col]=self.WHITEself.figure[min_row:,min_col:max_col]=self.GetColor(val,self.length)defSetVal(self,idx,val):self.data[idx]=valself._set_figure(idx,val)self.Visualize((idx,))defSwap(self,idx1,idx2):self.data[idx1],self.data[idx2]=self.data[idx2],self.data[idx1]self._set_figure(idx1,self.data[idx1])self._set_figure(idx2,self.data[idx2])self.Visualize((idx1,idx2))

详细代码见github:

(就等你的小小star)其他的都没有什么了,有细节的问题可以在我的github下面留言勾搭。

最后附上一张效果图:

CTA核心技术及应用峰会

5月25-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心隆重召开,峰会将围绕人工智能领域,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。

THE END
1.排序算法动画演示资源集合文章浏览阅读2.4k次,点赞3次,收藏12次。排序算法动画网站_排序算法演示网站https://blog.csdn.net/baiqi123456/article/details/126367099
2.七个有创意的数据结构与算法可视化网站,推荐给老师学生和开发这是一个由新加坡国立大学开发的可视化网站,包含了23种算法的动画,从基本的排序算法到罕见的图遍历算法。还有一个小测验功能来测试自己的学习! 3.sorting-algorithms 网站:https://www.toptal.com/developers/sorting-algorithms 这是一个排序算法可视化,提供各种排序算法的动画。这些动画显示了在4种不同的初始条件下的https://www.51cto.com/article/774723.html
3.排序算法LeetBook什么是排序算法? 排序算法,就是通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率,同样排序算法是每个程序员的算法基本功之一。 你将: https://leetcode-cn.com/leetbook/detail/sort-algorithms/
4.常用算法及算法可视化网址收藏不经一番寒彻骨选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 2.1 算法描述 https://www.cnblogs.com/venje/p/11929363.html
5.可视化算法网站汇总,从此简单学算法!(附动图)一个数据可视化和算法可视化的网站,用它可以生成各种各样的数据结构,模拟它们添加和删除的过程,而且还可以用它来演示算法的执行过程。 内容演示 比如,我们用它来模拟一个二叉搜索树,如下图所示: 我们再用它来演示一下快速排序算法,如下图所示: 网站特点 https://maimai.cn/article/detail?fid=1523043265&efid=0b1HvfbFcoSoa5HNkdMRzA
6.高中信息技术课程标准(2)通过实例,掌握使用数据查找算法设计程序解决问题的方法。 例 使用顺序查找算法和对分查找算法查找校运动会上某个班级或者某个运动员的比赛成绩。 (3)通过实例,掌握使用排序算法设计程序解决问题的方法。 例设计一个程序,按照选择交换法,把学校运动会比赛成绩(无序)按降序排序后存储。 https://www.fqkhzx.cn/index/article/view/id/94.html
7.SortingAlgorithmsAnimationsToptal?Animation, code, analysis, and discussion of 8 sorting algorithms on 4 initial conditions.http://www.sorting-algorithms.com/
8.快速排序算法(论文)(a,q+1,r);5课程设计总结及心得课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾此次快速排序算法演示课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到https://m.renrendoc.com/paper/202966848.html
9.通过动画可视化数据结构和算法VisuAlgo 于2011年由Steven Halim博士构想出来,作为一个工具,帮助他的学生更好地理解数据结构和算法,让他们能够自学基础知识并按照自己的节奏进行。他与新加坡国立大学的学生一起开发并整合了一系列的可视化,从简单的排序算法到复杂的图形数据结构。虽然这些设计主要是http://visualgo.net/zh
10.十大经典排序算法动画演示AlgorithmMan,一套免费的算法演示神器,附带GitHub开源下载地址。 1、Sorting Algorithms Animations 2、算法的分类 3、时间复杂度 算法 1、冒泡排序 它重复地访问要排序的元素列,一次比较两个相邻的元素,如果他们的顺序不符合预期就把他们交换过来。访问元素的工作是重复地进行直到没有相邻元素需要交换时为止。 https://www.jianshu.com/p/e9cfc2cc869c
11.GitHubJourWon/sort插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素https://github.com/JourWon/sort-algorithm
12.推荐几个算法可视化网站这是一个在线数据可视化工具,可以手动创建各种数据结构,包括队列、栈、堆、树等等,并且支持递归、排序、搜索等算法的动态演示。该工具由旧金山大学开发。 这个工具通过可视化的方式展现了数据结构和算法,方便我们理解其中的原理。网站容易操作、内容丰富且容易理解,非常nice~虽然网站是英文的,不过都是些容易理解的术语,英https://www.zhihu.com/tardis/bd/art/582280054
13.科学网—Python学习笔记1:排序二、Sort方法的排序算法 正因为可以自定义cmp方法,不妨探究一下,built-in的sort方法,到底是采用的哪一种排序算法: from random import shuffle def my_cmp(E1, E2): print 'E1:', E1, 'E2:', E2 return cmp(E1, E2) L = range(0, 10) https://blog.sciencenet.cn/blog-243747-369619.html
14.c++几种基本的插入排序(图文)C语言2.然后分别对 4 个小组进行插入排序,排序后的结果为: 3.然后,取 d2 = 2,将原数组分为 2 小组,如下图: 4.然后分别对 2 个小组进行插入排序,排序后的结果为: 5.最后,取 d3 = 1,进行插入排序后得到最终结果: 算法演示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20https://www.jb51.net/article/57742.htm
15.可视化数据结构算法演示Basics Stack: Array Implementation Stack: Linked List Implementation Queues: Array Implementation Queues: Linked List Implementation Lists: Array Implementation (available injavaversion) Lists: Linked List Implementation (available injavaversion) Recursion https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
16.冒泡排序和数据结构和算法可视化网站(及其一点小优化)二、动图演示原理 三、代码实现: 四、优化后的冒泡排序 五、算法演示网站 一、冒泡排序的原理 冒泡排序就是两两交换,第一趟排序可以得到最大值,那么第二趟排序就不用再比较最大值了,同样是两两交换,找出第二大的值。然后经过n-1次趟的两两比较之后就可以排序完毕了。 https://cloud.tencent.com/developer/article/2178519
17.互联网信息服务算法备案系统国家互联网信息办公室关于发布第九批深度合成服务算法备案信息的公告 2024-12-20 置顶 国家互联网信息办公室关于发布互联网信息服务算法备案信息的公告 2024-12-20 置顶 《互联网信息服务深度合成管理规定》备案填报指南 2022-12-22 系统升级变更通告 2024-11-22 https://beian.cac.gov.cn/
18.Python基础知识Python编程基础算法Python基础算法是解锁编程世界的钥匙,它们为我们提供了解决各种问题的方法。排序算法可以帮助我们整理数据,搜索算法可以帮助我们查找特定元素,图算法可以帮助我们探索网络的奥秘,通过学习和应用基础算法,我们可以提高程序的效率和性能,解决实际问题。https://www.bwie.com/jsgh/66.html
19.上海市教育考试院为进一步加强本市高校计算机基础教学工作,推进学校更加科学、合理地设置计算机基础课程及安排教学内容,适应现代信息技术发展对人才培养的需要,经上海市教委、上海市高等学校计算机等级考试委员会和上海市教育考试院审定,自2016年起上海市高等学校计算机等级考试实施新修订的考试大纲。 https://www.shmeea.edu.cn/page/05800/20160329/5128.html