3min利用Python实现9种经典排序算法可视化!(附源代码)

2023-11-20

640?wx_fmt=png

来源:恋习Python

本文附视频建议收藏

本文为你分享实现9种经典排序算法可视化的方法,3分钟即可实现。


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


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


▲6分钟演示15种排序算法


具体讲解需要解决问题的实现思路如下:


  • 如何表示数组

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

  • 如何实现排序算法

  • 如何把数组可视化出来


如何表示数组


Python提供了list类型,很方便表示C++中的数组。标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。


对于数值运算来说这种结构显然比较浪费内存和CPU计算时间,在此就不详细论述。


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


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


示例代码:


 
 
import random
data = list(range(100))
data = random.choices(data, k=100)
print(data)
[523345334825682878237835244469886629827784121910
2724574271752517794448186622569978656473151402141
21175688419246568023704996835416368224686016981681,
 101311246835563923446303605666382847472590893868
21]


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


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


data = random.sample(data, k=100)
print(data)
[492856284462812548335438301613192356606641246868,
 77927824663809478418488215625257524388231522310
71402746333556511231225891621211142474481358688
29367716396576996682486979069106898564483477017
47826045]


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


如何实现排序算法


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


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


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

基础的插入法排序是两重循环,希尔排序是三重循环,最外面一重循环,控制增量gap,并逐步减少gap的值。二重循环从下标为gap的元素开始比较,依次逐个跨组处理。最后一重循环是对组内的元素进行插入法排序。


这样进行排序的优点在于每次循环,整个序列的元素都将小元素的值逐步向前移动,数值比较大的值向后移动。


示例代码:


 
 
from data import DataSeq

def ShellSort(ds):
    assert isinstance(ds, DataSeq), "Type Error"

    Length = ds.length
    D = Length//2
    while D>0:
        i=0
        while i<Length:
            tmp = ds.data[i]

            j=i
            while j>=1 and ds.data[j-D]>tmp:
                ds.SetVal(j, ds.data[j-D])
                j-=D
            ds.SetVal(j, tmp)

            i+=D
        D//=2

if __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", repeatition=False):
        pass
    def Getfigure(self):
        _bar_width = 5
        figure = np.full((self.length*_bar_width,self.length*_bar_width,3), 255,dtype=np.uint8)
        for i in range(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_width
        self.figure = figure
    def _set_figure(self, idx, val):
        min_col = idx*self._bar_width
        max_col = min_col+self._bar_width
        min_row = -1-val*self._bar_width
        self.figure[ : , min_col:max_col] = self.WHITE
        self.figure[ min_row: , min_col:max_col] = self.GetColor(val, self.length)
    def SetVal(self, idx, val):
        self.data[idx] = val
        self._set_figure(idx, val)

        self.Visualize((idx,))

    def Swap(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))


附上一张效果图:


640?wx_fmt=jpeg


附上源码链接:

https://github.com/ZQPei/Sorting_Visualization


编辑:文婧

校对:龚力

640?wx_fmt=jpeg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3min利用Python实现9种经典排序算法可视化!(附源代码) 的相关文章

  • GDI+学习笔记7-统计报表的图形绘制

    图形编程 SetPixel 设置指定点的颜色 COLORREF SetPixel HDC hDC int X int Y COLORREF crColor hDC 绘制点的DC X Y 坐标位置 crColor 设置的颜色 返回值为设置颜色
  • ubuntu虚拟机与windows系统间不能复制粘贴

    sudo tar zxf VMwareTools 10 3 23 17030940 tar gz 这个命令时解压文件 输入 sudo vmware tools distrib vmware install pl 与 vmware tools
  • PHP的进制转换与字符串的编码解码

    目录 一 进制转换函数 dechex hexdec decbin bindec base convert 二 编码解码函数 bin2hex hex2bin pack 和 unpack 三 字符串类型详解 PHP字符串 从PHP 5 2 1版
  • 15.输入捕获

    1 输入捕获介绍 STM32除了基本定时器 定时器6和定时器7 之外 其他的都具有输入捕获功能 输入捕获可以对输入的信号的上升沿 下降沿或双边沿进行捕获 通常用于测量输入信号的脉宽 测量PWM输入信号的频率及占空比 首先将捕获到t1信号之后
  • [论文阅读] (14)英文论文实验评估(Evaluation)如何撰写及精句摘抄(上)——以入侵检测系统(IDS)为例

    娜璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者的英文水平和学术能力不高 需要不断提升 所以还请大家批评指正 非常欢迎大家给我留言评论 学术路上期待与您前行 加油 前一篇从个人角度介绍英文论文
  • Linux调出git页面,Linux 显示 git 分支 及 完整路径

    一 编辑 bashrc文件vim bashrc 二 在文件末尾添加如下shellfunction git branch branch git branch 2 gt dev null grep sed e s if branch then
  • 在线使用AI合集

    POE 前言 目前有关注的小伙伴应该会发现 ChatGPT注册功能已经关闭 那些还没有注册的小伙伴岂不是不能使用ChatGPT 今天为大家推荐的就是Poe AI机器人集合 Sage Claude ChatGPT Dragonfly Poe链
  • 前端数据请求的10种方式与最佳实践

    前言 在前端开发中 数据请求是经常遇到的一个问题 本文将介绍前端常见的10种数据请求方式 并给出每个方式的代码示例与使用场景 以帮助开发者更好的选择和使用 1 Fetch API Fetch API 是浏览器内置的一个用于网络请求的全局接口
  • 在ubuntu下安装并测试pig以及常见的问题

    1 安装 只安装在namenode节点上即可 1 1 下载并解压 下载 http pig apache org releases html下载pig 0 12 1版本的pig 0 12 1 tar gz 存放路径 home Hadoop 解
  • EXCEL导出封装 C#

    public class ExportToExcel public void Export List
  • flutter 一个Widget布局只return一次,但是可以有叠加覆盖的思想

    首先一个Widget只会return一次 但是如果有多个情况 多个判断 通过不同情况返回不同布局 就可以通过叠加的方式 下一个布局会替换掉上一个布局 messageTypeView Container 保底防止报错 文字 case 1 me
  • STM32串口通信详解

    作者简介 嵌入式入坑者 与大家一起加油 希望文章能够帮助各位 个人主页 rivencode的个人主页 系列专栏 玩转STM32 保持学习 保持热爱 认真分享 一起进步 目录 一 数据通信方式 1 串行与并行通信 2 全双工 半双工及单工通讯
  • 采用update-alternatives 切换python版本

    update alternatives是Debian提供的一个工具 非Debian系的就不用看了 原理类似于上面一个办法 也是通过链接的方式 但是其切换的过程非常方便 首先看一下update alternatives的帮助信息 update
  • [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL s...

    Err 1064 You have an error in your SQL syntax check the manual that corresponds to your MySQL server version for the rig
  • kpca故障诊断matlab,关于用KPCA做故障检测,请教SPE控制图应该怎么做

    function qn kpca dtrain kernel q Fa Ca KPCA 核主成分分析 使用 trainFeat bj kpca data kernel p1 p2 输入 data 原始数据文件名 kernel 核函数 p1
  • eclipse导入外部项目后出现红叉解决方法

    eclipse开发工具中 在导入java项目时 有时会出现红叉 的现象 并且会发现里面的程序仍然能正常运行 原因 因为每个电脑上eclipse的环境都不太一样 导入项目后才回有红叉 这时只需要该变一下这个项目的环境就可以了 解决方法 第一步
  • nrm 切换 npm 源

    npm 配置仓库 查看当前仓库配置 npm config list 查看配置 npm config ls l 查看详细配置 可以看到 registry 配置 就是仓库地址 简述修改配置的 3 种方式 1 通过 config 配置 npm c
  • cesium for ue->CesiumUtility

    该模块共18个文件 3152行 含注释 截至2022年11月9日 剩下13个文件 1443行
  • 贝叶斯相关公式(Bayes)

    这里只是记录一下 非常推荐马同学高等数学 文末有原文 点击这里看里面的例一应该是理解贝叶斯公式最好的例子 如果你稍微有一些基础 我觉得文末第二个链接中的例一更加适合你 代数推导 1 贝叶斯公式 是根据条件概率推导的 P A B P AB P
  • 基于ssm+ajax实现的多条件带省略号分页

    ssm ajax layui实现的多条件分页源码 案列种包含数据库和前后台完整源码 演示地址 ssm ajax实现的多条件分页源码 前台核心代码 layui use form function var form layui form for

随机推荐

  • 一些论文审稿方面的体会

    本人小硕在读 老师也让帮忙审了论文 多是与自己领域相关的 老师让多学习学习 每次审论文都感觉诚惶诚恐 要是提的问题太多吧 感觉万一给拒了作者该多伤心啊 这挑的问题少吧 这明显对不起更多的人嘛 大体总结一下自己遇到的问题吧 一 现在论文提交量
  • Win10+CUDA8.0+Visual Studio2013安装、环境配置教程

    最近刚开始接触opencv的GPL编程 所以自己搜了下网上有关配置CUDA的过程 经过摸索整理 配置成功 现将教程整理如下 1 下载CUDA安装包 下载地址https developer nvidia com cuda downloads
  • 使用CUDA和CUFFT进行快速1D卷积的示例

    使用CUDA和CUFFT进行快速1D卷积的示例 在计算机视觉 数字信号处理和机器学习中 卷积是一种常见的操作 然而 卷积操作通常需要大量计算 因此需要一种高效的方法来完成 CUDA和CUFFT可以用于对使用FFT的快速1D卷积进行加速 在本
  • [Unity XLua]热更新XLua入门(一)-基础篇

    Aladdin XLua 前言 前段时间腾讯开源了一个内部热更框架XLua在Unity开发群里引起一阵热议 也受到广大开发者的热捧 然后我当然也抱着好奇的心去学习学习 后面也会将扩展之后的工程放在git上 大家一起学习交流 在此感谢XLua
  • c3p0数据库连接池死锁问题和mysql重连,连接丢失

    c3p0参数解释 最常用配置 initialPoolSize 连接池初始化时创建的连接数 default 3 取值应在minPoolSize与maxPoolSize之间 c3p0 initialPoolSize 10 minPoolSize
  • 敏捷项目管理ACP解析会笔记

    互联网时代企业环境现状 产品生命周期急剧缩短 市场环境变化太快 客户不满意 客户 团队 产品 产品需求界定不清 什么是敏捷项目管理 低成本 快速度 高质量 交付更高质量 敏捷宣言 个体和交互 重于过程和工具 可工作的软件 重于面面俱到的文档
  • Java高并发处理方案

    java高并发 如何解决 什么方式解决 一 什么是高并发 二 高并发解决思路 三 高并发解决方案 一 什么是高并发 1 1 高并发 High Concurrency 是互联网分布式系统架构设计中必须考虑的因素之一 它通常是指 通过设计保证系
  • 实现一个函数,判断一个数是不是素数

    include
  • Stream实现List和Map互转总结

    本文来说下Stream实现List和Map互转总结 文章目录 实体类 Map转List代码 List转Map代码 实体类 本篇介绍Stream流List和Map互转 同时在转换过程中遇到的问题分析 package cn wideth col
  • 找到专业的软件外包开发公司

    今天给大家分享怎么样找软件开发公司开发 而且找到的是既负责又专业的 那怎么去找呢 看哪些方面 北京木奇移动技术有限公司 专业的软件外包开发公司 欢迎交流合作 1 案例看实力 在选择软件定制开发公司时 必须要留意对方的案例如何 有否做过大型的
  • 理解HTTP headers之Expires、Cache-Control、IF-Modified-Since

    一 什么是Http headers 当你在浏览器地址栏里键入一个url 你的浏览器将会类似如下的http请求 GET tutorials other top 20 mysql best practices HTTP 1 1 Host net
  • Hive函数row_number实现

    需求 查询一批用户最后三次登陆时间 ip数据 理解需求是实现分组取前n个值 实现方式是先按照uid字段升序或倒序 时间字段倒序排序数据集合 然后遍历数据集合 用row number函数遍历uid字段 相同则row number值 1 取ro
  • el-table添加border边框线不显示

    el table添加border属性 使用作用域插槽 会不现实左边的边框线 或者右边的边框线 总结问题 1 固定了表格的高度 height 250 把高度去掉
  • JavaScript(函数,作用域和闭包)

    目录 一 什么是函数 1 1 常用系统函数 1 2 函数声明 1 3 函数表达式 二 预解析 2 1 函数自调用 2 2 回调函数 三 变量的作用域 3 1 隐式全局变量 四 作用域与块级作用域 五 作用域链 六 闭包 一 什么是函数 类似
  • 微信小程序:图片高度设置无效问题

    控制台查看元素 显示其style中多了一个没有设置的高度值 找了很久发现是因为image标签设置了mode widthFix 此时高度会自适应 样式中设置高度无效
  • 对接百度api的工具类:Base64Util,FileUtil,HttpUtil

    对接百度api的工具类 Base64Util FileUtil HttpUtil package com baidu ai aip utils Base64 工具类 public class Base64Util private stati
  • Windows中安装GCC教程

    GCC的安装教程 GCC简介 GCC编译器通常在Linux系统下使用 一般来说大部分发行的系统会默认安装 GCC编译器使用gcc指令在终端进行shell操作 对于新接触Linux的朋友来说 简单的在Windows中练习过渡一下应该就足够了
  • Python数据库接口以及API

    非常详细的解释 包含数据库分类以及各种数据库的特点 https wiki python org moin DatabaseInterfaces
  • flex布局详解

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 flex基本概念 任何一个容器都可以指定为Flex布局 例如 box displa
  • 3min利用Python实现9种经典排序算法可视化!(附源代码)

    来源 恋习Python 本文附视频 建议收藏 本文为你分享实现9种经典排序算法可视化的方法 3分钟即可实现 导 读 近在某网站上看到一个视频 是关于排序算法的可视化的 看着挺有意思的 也特别喜感 不知道作者是怎么做的 但是突然很想自己实现一