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

6分钟演示15种排序算法

https://v.qq.com/x/page/t0396emm8oy.html

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

附上源码链接:

https://github.com/ZQPei/Sorting_Visualization

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

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

一、如何表示数组

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

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

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

示例代码:

import randomdata = 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]

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

三、如何实现排序算法

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

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

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

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

示例代码:

from data import DataSeqdef ShellSort(ds): assert isinstance(ds, DataSeq), "Type Error" Length = ds.length D = Length//2 while D>0: i=0 while i=1 and ds.data[j-D]>tmp: ds.SetVal(j, ds.data[j-D]) j-=D ds.SetVal(j, tmp) i+=D D//=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的值。

示例代码:

class DataSeq: 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

快速修改数组的某个值_我用Python,3分钟快速实现,9种经典排序算法的可视化...相关推荐

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

    作者 | 爱笑的眼睛 来源 | 恋习Python(ID:sldata2017) 最近在某网站上看到一个视频,是关于排序算法的可视化的,看着挺有意思的,也特别喜感. ▼ 6分钟演示15种排序算法 不知道 ...

  2. vue快速修改数组的某个值_详解vue组件三大核心概念

    前言 本文主要介绍属性.事件和插槽这三个vue基础概念.使用方法及其容易被忽略的一些重要细节.如果你阅读别人写的组件,也可以从这三个部分展开,它们可以帮助你快速了解一个组件的所有功能. 本文的代码请猛 ...

  3. python遍历数组冒泡排序_经典排序算法(冒泡排序,选择排序,插入排序,快速排序,堆排序)python实现...

    最近在复习经典排序算法,自己用python也实现了一下,这里不会涉及到原理(因为网上方法已经很详细啦),就把函数贴上来,可以让大家自己试着运行下,再结合别处的原理也可以更好地理解它们的实现. 如果有错 ...

  4. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  5. 按复杂度有效性递减排序_十大经典排序算法:python源码实现,通俗深入讲解

    概述 提示:本文上万字,陆陆续续疏理知识点加测试代码,耗时近一个月.阅读时长40分钟左右. 本文将十大经典排序算法进行汇总,从源码实现.复杂度.稳定性进行分析,并对每种排序的特性进行点评.对典型算法, ...

  6. 排序算法java 简书_史上最全经典排序算法总结(Java实现)

    查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在 ...

  7. 冒泡和快速排序的时间复杂度_十大经典排序算法——快速排序

    目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面. 不稳定:如果a原本在b的前面,而a ...

  8. python新手教程 从零开始-Python零基础从零开始学习Python十分钟快速入门

    原标题:Python零基础从零开始学习Python十分钟快速入门 学习Python的,都知道Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python是一种动态解释型的 ...

  9. arr数组怎么取值_记一次思否问答的问题思考:Vue为什么不能检测数组变动

    作者 | hfhan 来源 | https://segmentfault.com/a/1190000015783546 问题描述:Vue检测数据的变动是通过Object.defineProperty实 ...

最新文章

  1. YOLOv5实现自定义对象训练与OpenVINO部署全解析
  2. 王者服务器维护什么时间结束s22,王者荣耀s22赛季结束时间 s22赛季什么时候结束?[多图]...
  3. smartforms打印不了可能问题
  4. c/s 自动升级(WebService)
  5. pytorch微调bert_小版BERT也能出奇迹:最火的预训练语言库探索小巧之路
  6. 从binlog恢复数据及Mysqlbinlog文件删除
  7. puppeteer执行js_使用Node.js和Puppeteer与表单和网页进行交互– 2
  8. Testlink1.9.5的安装配置
  9. IIS锁定是默认设置的 (overrideModeDefault=“Deny“)问题解决
  10. 慵懒中长大的人,只会挨生活留下的耳光
  11. 普通二本,去了小公司,我也想改变
  12. linux rz sz putty,PuTTY xshell rz sz命令实现上传下载到windows的方法
  13. 倍福---绝对值编码器位置保存
  14. 解密Cocos2D中的Lua源码
  15. RISC-V 之一 使用 ARM CMSIS 的 SVD 文件辅助调试
  16. matlab u怎么求均方差,Matlab求方差,均值,均方差,協方差的函數
  17. 基于Excel的检定证书报告输出
  18. java逻辑与或非_Java基础——逻辑运算符与或非
  19. NetBeans的下载、安装
  20. DW怎么把模板拽进html文件中,在Dreamweaver中如何使用模板

热门文章

  1. Linux zip加密压缩
  2. 解决centos7 wget 报错nown. wget: unable to resolve host address ‘mirrors.aliyun.com’
  3. pandas 使用把dataframe变为series
  4. django-crontab 快速配置,高效执行django的定时任务/周期性任务
  5. 排序算法(3)----归并排序
  6. matlab对话框可以改变位置_正压送风口安装好后可以随意改变位置吗?
  7. 用c语言实现循环神经网络,浅谈LSTM循环神经网络
  8. IP通信基础学习第十周
  9. 分布式对象存储 读书笔记(一) 开始
  10. PCL学习(三) SAC-IA 估记object pose