美文网首页动态语言Ruby Python Python18Python
9 种经典排序算法的可视化,用Python3分钟就可以搞定!

9 种经典排序算法的可视化,用Python3分钟就可以搞定!

作者: 妄心xyx | 来源:发表于2019-01-24 15:21 被阅读26次

    不知道作者是怎么做的,但是突然很想自己实现一遍,而且用python实现特别快,花了一天的时间,完成了这个项目。主要包括希尔排序(Shell Sort)、选择排序(Selection Sort)、快速排序(Quick Sort)、归并排序(Merge Sort)等九种排序。

    附上源码链接:

    https://github.com/ZQPei/Sorting_Visualization

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

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

    • 如何表示数组
    • 如何得到随机采样数组,数组有无重复数据
    • 如何实现排序算法
    • 如何把数组可视化出来

    一、如何表示数组

    python提供了list类型,很方便可以表示C++中的数组。标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间,再次就不详细论述。

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

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

    示例代码:

    image

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

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

    image

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

    三、如何实现排序算法

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

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

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

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

    示例代码:

    image

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

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

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

    为什么不用matplotlib?

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

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

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

    示例代码:

    image

    详细代码见github:

    https://github.com/ZQPei/Sorting_Visualization

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

    最后附上一张效果图:

    image

    相关文章

      网友评论

        本文标题:9 种经典排序算法的可视化,用Python3分钟就可以搞定!

        本文链接:https://www.haomeiwen.com/subject/iczyjqtx.html