您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

5种python方法实现冒泡排序可视化:Bubble Sort Visualizer

时间:2020-08-19 15:07:29  来源:  作者:

1 说明:

=====

1.1 冒泡排序:

1.1.1 原理:比较两个相邻的元素,将值大的元素交换至右端。

1.1.2 来源:由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故得名。

1.1.3 是一种最简单直观的排序算法之一。

5种python方法实现冒泡排序可视化:Bubble Sort Visualizer

 

1.2 冒泡排序可视化:

1.2.1 Bubble Sort Visualizer。

1.2.2 更能直观了解这种排序。

1.2.3 通过多种方法实现,理解该算法,同时复习Python

1.2.4 python法,采用:matplotlib法、pygame法、turtle法(2d+3d)、opencv法。

1.2.5 代码来源网络,来源已注明,仅供学习,感谢网友,适合收藏。

============

具体代码和讲解

============

2 python法:

========

2.1 matplotlib法

2.1.1 效果图:

5种python方法实现冒泡排序可视化:Bubble Sort Visualizer

 

2.1.2 代码来源:

#https://blog.csdn.net/m1090760001/article/details/103217052

2.1.3 代码一:

from matplotlib import pyplot as plt
import random

LIST_SIZE = 10  #10个组bar
PAUSE_TIME = 4 / LIST_SIZE
# 冒泡算法
def bubble_sort(nums):
    for i in range(len(nums) - 1):
        for j in range(len(nums) - i - 1):
            if nums[j] > nums[j + 1]:
                nums[j], nums[j + 1] = nums[j + 1], nums[j]
            plt.cla()  # 清除内容
            plt.bar(range(len(nums)), nums, align='center')
            plt.bar(j, nums[j], color="r", align="center")
            plt.bar(j + 1, nums[j + 1], color="r", align="center")
            plt.pause(PAUSE_TIME)
    plt.show()

if __name__ == "__main__":
    nums = []
    for i in range(LIST_SIZE):
        nums.Append(random.randint(0, 1000))  #随机生成
    bubble_sort(nums)
    print(nums)

2.2 turtle法:

2.2.1 2d-turtle法:

2.2.1.1 来源:

#https://blog.csdn.net/avskya/article/details/82958907

2.2.1.2 效果图:

5种python方法实现冒泡排序可视化:Bubble Sort Visualizer

 

2.2.1.3 代码二:

from turtle import *
from random import randint
from time import sleep

class Column(Turtle):
    def __init__(self,x):
        Turtle.__init__(self,shape='square')     
        self.up()                         #抬笔
        r = randint(0,255)
        g = randint(0,255)
        b = randint(0,255)        
        self.fillcolor(r,g,b)
        self.scale = randint(1,38)        # 20 * self.scale 为柱子高度
        self.setx(x)
        self.__half__ = self.screen.window_height()//2 #屏幕的半高
        self.shapesize(self.scale,1)                   #相对于自身坐标系前进的垂直方向放大
        self.sety(0- self.__half__ + 10*self.scale  + 30)  
        
if __name__=="__main__":
    width,height=800,800
    screen = Screen()
    screen.colormode(255)
    screen.setup(width,height)
    screen.title("冒泡排序动态演示")
    screen.delay(0)
    xcors = [x for x in range(40-width//2,width//2-20,40) ]
    columns = [Column(x) for x in xcors ] #生成所有柱子
    length = len(columns)
    while True:
        Flag = False                  #描述是否交换了数据的标志
        for i in range(0,length-1 ):      #由于越往后,越不要排这么多次数了.
            c1 = columns[i]               #代表前面柱子
            c2 = columns[i + 1]           #代表后面柱子
            if c1.scale > c2.scale:       #如果前面的柱子更高,则交换位置
                x1 = c1.xcor()             #保留前面柱子c1的x坐标
                x2 = c2.xcor()             #保留后面柱子c2的x坐标
                columns[i] = c2            #让前面的柱子赋值为后面柱子        
                columns[i+1] = c1          #让后面的柱子赋值为前面柱子
                columns[i].setx(x1)   #交换列表中项目后,重新设置x坐标
                columns[i+1].setx(x2) #交换列表中项目后,重新设置x坐标
                Flag = True
            screen.update()
            sleep(0.1)
            
        length = length - 1
        if  Flag == False:break #如果一次都没有排序,则退出while循环

2.2.2 3d-turtle法:

2.2.2.1 来源:

#https://blog.csdn.net/magicdoubi/article/details/88843825

2.2.2.2 效果图:

5种python方法实现冒泡排序可视化:Bubble Sort Visualizer

 

2.2.2.3 代码三:

from turtle import *
from random import *
import time

def bubble_sort(rectangle_list):
    for passnum in range(0, 10 - 1):
        for i in range(0, 10 - passnum - 1, 1):
            if rectangle_list[i].num > rectangle_list[i + 1].num:
                rectangle_list[i].replace(rectangle_list[i + 1])
                time.sleep(0.5)  # 休眠1秒

class Cube():
    def __init__(self, x, y, num, leng=10):
        self.x = x
        self.y = y
        self.num = num
        self.side_len = leng
        self.create_cube()

    def create_side(self):
        fillcolor("#639CD3")
        begin_fill()
        left(170)
        forward(self.side_len)
        right(80)
        forward(20 * self.num)
        right(100)
        forward(self.side_len)
        right(80)
        forward(20 * self.num)
        end_fill()
        setheading(0)  # 恢复向右默认

    def create_top(self):
        fillcolor("#95CEFF")
        penup()
        goto(self.x, self.y + 20 * self.num)
        pendown()
        begin_fill()
        forward(20)
        left(170)
        forward(self.side_len)
        left(10)
        forward(20)
        left(170)
        forward(self.side_len)
        end_fill()
        setheading(0)  # 恢复向右默认

    def create_rectangle(self):
        color("#639CD3")
        penup()
        goto(self.x, self.y)
        pendown()
        #柱的正面颜色
        fillcolor("green")
        begin_fill()
        for x in range(1, 5):
            if x % 2 == 1:
                n = 20
            else:
                n = 20 * self.num
            forward(n)
            left(90)
        end_fill()

    def create_cube(self):
        tracer(False)
        self.create_rectangle()
        self.create_side()
        self.create_top()
        tracer(True)

    def erase_rectangle(self):
        setheading(0)
        color("white")
        penup()
        goto(self.x, self.y)
        pendown()
        fillcolor("white")
        begin_fill()
        for x in range(1, 5):
            if x % 2 == 1:
                n = 20
            else:
                n = 20 * self.num
            forward(n)
            left(90)
        end_fill()

    def erase_side(self):
        fillcolor("white")
        begin_fill()
        left(170)
        forward(self.side_len)
        right(80)
        forward(20 * self.num)
        right(100)
        forward(self.side_len)
        right(80)
        forward(20 * self.num)
        end_fill()
        setheading(0)  # 恢复向右默认

    def erase_top(self):
        fillcolor("white")
        penup()
        goto(self.x, self.y + 20 * self.num)
        pendown()
        begin_fill()
        forward(20)
        left(170)
        forward(self.side_len)
        left(10)
        forward(20)
        left(170)
        forward(self.side_len)
        end_fill()
        setheading(0)  # 恢复向右默认

    def erase_cube(self):
        tracer(False)
        self.erase_rectangle()
        self.erase_side()
        self.erase_top()
        tracer(True)

    def replace(self, n):
        self.erase_cube()
        n.erase_cube()
        self.num, n.num = n.num, self.num
        self.create_cube()
        n.create_cube()

if __name__ == '__main__':
    hideturtle()
    var = list()
    for i in range(0, 10):
        var.append(Cube(35 * i, 0, randint(1, 10)))
    bubble_sort(var)
    done()

2.3 opencv法:

2.3.1 来源:

#https://blog.csdn.net/u011983560/article/details/106195385

2.3.2 效果图:

5种python方法实现冒泡排序可视化:Bubble Sort Visualizer

 

2.3.3 代码四:

import numpy as np
import os
import cv2

class Dataseq():
    WHITE = (255,255,255)
    RED = (0,0,255)
    BLACK = (0,0,0)
    YELLOW = (0,127,255)
    
    def __init__(self, data=None,sort_type='figure'):
        self.sort_type=sort_type
        self.interval=400  #原来是5,太小了 
        #注意与data数据最大值和最小值也有关系,与跳跃时间也有关
        self.inter=2
        if data==None:
            print("there are no data to sort!!!")
            os.exit()
        else:
            self.data=data
            self.maxd=max(self.data)  #最大值
            self.mind=min(self.data)  #最小值
        self.getfigure()
        self.Visualize()
        self.sortdata()
    
    def getfigure(self):
        datanum=len(self.data)
        maxd=max(self.data)
        mind=min(self.data)
        self.figure=np.full((500*(maxd-mind)+50, (datanum)*(self.interval+self.inter), 3), 255,dtype=np.uint8)
        for i in range(len(self.data)):
            self.figure[-50-(self.data[i]-mind)*500:,(i)*(self.interval+self.inter):(i)*(self.interval+self.inter)+self.interval]=self.YELLOW
    
    def choice(self, i, j):
        mind=self.mind
        self.figure[-50-(self.data[i]-mind)*500:,(i)*(self.interval+self.inter):(i)*(self.interval+self.inter)+self.interval]=self.BLACK
        self.figure[-50-(self.data[j]-mind)*500:,(j)*(self.interval+self.inter):(j)*(self.interval+self.inter)+self.interval]=self.BLACK
        self.Visualize()
    
    def change(self,i,j):
        mind=self.mind
        self.figure[-50-(self.data[i]-mind)*500:,(i)*(self.interval+self.inter):(i)*(self.interval+self.inter)+self.interval]=self.WHITE
        self.figure[-50-(self.data[j]-mind)*500:,(j)*(self.interval+self.inter):(j)*(self.interval+self.inter)+self.interval]=self.WHITE
        indata=self.data[i]
        self.data[i]=self.data[j]
        self.data[j]=indata
        self.figure[-50-(self.data[i]-mind)*500:,(i)*(self.interval+self.inter):(i)*(self.interval+self.inter)+self.interval]=self.BLACK
        self.figure[-50-(self.data[j]-mind)*500:,(j)*(self.interval+self.inter):(j)*(self.interval+self.inter)+self.interval]=self.BLACK
        self.Visualize()
    
    def Visualize(self):
        figure1=self.figure
        cv2.namedWindow('img',cv2.WINDOW_NORMAL)
        cv2.imshow('img',figure1)
        cv2.waitKey(1000)

    def sortdata(self):
        for di in range(len(self.data)):
            for dj in range(len(self.data)-di-1):
                self.choice(dj,dj+1)
                if self.data[dj]>self.data[dj+1]:
                    self.change(dj,dj+1)
                self.getfigure()

datat=Dataseq([10,20,30,15,25,18],'sort') 
datat.Visualize()   
cv2.destroyAllwindows()

2.4 pygame法:

2.4.1 来源:

#https://github.com/zetaleee/Visualization-algorithm

2.4.2 效果图:

5种python方法实现冒泡排序可视化:Bubble Sort Visualizer

 

2.4.3 代码五:

import pygame
from random import randint

gap = 10                        #竖条的间隔
width = 30                      #竖条的宽度
screenSize = (600, 250)         #显示屏幕的尺寸
barXPosition = []               #竖条在坐标轴的位置
Bars = []                       #竖条对象列表
#生成颜色
class color(object):
    @staticmethod
    def RandomColor():
        r,g,b = randint(0,225),randint(0,255),randint(0,255)
        return (r,g,b)
    @staticmethod
    def CalculateColor(self,num):
        pass

class bar(object):
    def __init__(self, n,num,screen,width = 30):
        self.n = n
        self.locationX = barXPosition[n]
        self.locationY = screenSize[1]-50-num
        self.num = num
        self.color = color.RandomColor()
        self.width = width
        self.font = pygame.font.Font(None, 20)
        self.screen = screen
    #绘制竖条及其上方的数字
    def BarDraw(self):
        pygame.draw.rect(self.screen, self.color,
                         ((self.locationX,self.locationY), (self.width, self.num)))
        self.txt = self.font.render("{}".format(self.num), True, self.color)
        self.screen.blit(self.txt, (self.locationX+5,self.locationY-20))
    #移动竖条,flag是用于判断移动方向 True向右 False向左
    def move(self,flag):
        pace = 2    #移动的步长
        #消除移动前的竖条
        pygame.draw.rect(self.screen, (255, 255, 235),
                         ((self.locationX, self.locationY), (self.width, self.num)))
        if flag:
            self.locationX += pace
        else:
            self.locationX -= pace
        # 绘制移动后的竖条
        pygame.draw.rect(self.screen, self.color,
                         ((self.locationX , self.locationY), (self.width, self.num)))
    #交换相邻两个竖条
    def ChangeLocation(self,otherBall):
        #清除当前位置图像与文字
        pygame.draw.rect(self.screen, (255, 255, 235),
                         ((self.locationX, self.locationY-20), (self.width, self.num+20)))
        pygame.draw.rect(otherBall.screen, (255, 255, 235),
                         ((otherBall.locationX, otherBall.locationY - 20), (otherBall.width, otherBall.num + 20)))
        #竖条移动的动画
        for n in range(20):
            self.move(True)
            otherBall.move(False)
            pygame.time.delay(40)
            pygame.display.flip()
        #移动后,重新写上竖条对应的数字
        self.screen.blit(self.txt, (self.locationX + 5, self.locationY - 20))
        otherBall.screen.blit(otherBall.txt, (otherBall.locationX + 5, otherBall.locationY - 20))
        #交换竖条对象在列表的位置,同时交换排位数字
        Bars[self.n],Bars[otherBall.n] =  Bars[otherBall.n],Bars[self.n]
        self.n,otherBall.n = otherBall.n,self.n
        pygame.display.flip()
        pygame.time.delay(200)      #此延时控制排序动画的快慢
#冒泡排序
def algorithm(nums):
    for i in range(len(nums) - 1):
        for j in range(len(nums) - 1 - i):
            if nums[j] > nums[j + 1]:
                Bars[j].ChangeLocation(Bars[j + 1])
                nums[j], nums[j + 1] = nums[j + 1], nums[j]
#计算十二个竖条在轴上的位置
def barX(gap,width,barXs):
        for n in range(12):
            barX = 50 + gap + (gap + width) * n
            barXs.append(barX)

def main():
    nums = []
    pygame.init()
    screen = pygame.display.set_mode(screenSize)
    pygame.display.set_caption("算法")                #标题
    screen.fill((255, 255, 235))                     #背景色
    barX(gap,width,barXPosition)                     #计算bar位置并存于barXs
    pygame.draw.aaline(screen,(0,255,0),(50,screenSize[1]-50),
                       (screenSize[0]-50,screenSize[1]-50))  #绘制坐标轴
    pygame.display.flip()
    #生成十二个竖条并绘制
    for n in range(12):
        num = randint(20,160)
        tempBar = bar(n,num,screen)
        tempBar.BarDraw()
        nums.append(num)
        Bars.append(tempBar)
        pygame.time.delay(50)  #此处延时是为了开始时演示动画效果
        pygame.display.flip()
    algorithm(nums)  #排序
    #等待关闭窗口事件
    run = True
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

if __name__ == "__main__":
    main()

===自己整理并分享出来===

喜欢的人,请点赞、关注、评论、转发和收藏。



Tags:冒泡排序   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15  Tags: 冒泡排序  点击:(16)  评论:(0)  加入收藏
排序算法有很多,像冒泡排序,选择排序,插入排序,希尔排序,快速排序等等。今天这篇文章呢,我们来聊一聊简单的冒泡排序(Bubble Sort)。 想必大家都知道鱼吐泡泡的现象,气泡从鱼的嘴巴里...【详细内容】
2021-09-07  Tags: 冒泡排序  点击:(55)  评论:(0)  加入收藏
1. 插入排序步骤:1.从第一个元素开始,该元素可以认为已经被排序2.取下一个元素tem,从已排序的元素序列从后往前扫描3.如果该元素大于tem,则将该元素移到下一位4.重复步骤3,直到找...【详细内容】
2021-08-19  Tags: 冒泡排序  点击:(98)  评论:(0)  加入收藏
01故事起源幼儿园放学,小朋友们集合,需要先从低到高排队,应该怎么排呢? 02开始行动小K身高180,是班里最高的,自然得往后排啦。小K先和身后的小B比较,然后和小B交换。 小K接着和身后...【详细内容】
2021-06-08  Tags: 冒泡排序  点击:(176)  评论:(0)  加入收藏
排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序(可以进行比较,例如整数,浮点数,字符串等)(增加,非递减,递减, 增加,词典等)。 有许多不同的排序算法,每...【详细内容】
2021-05-12  Tags: 冒泡排序  点击:(238)  评论:(0)  加入收藏
1 说明:=====1.1 冒泡排序:1.1.1 原理:比较两个相邻的元素,将值大的元素交换至右端。1.1.2 来源:由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故得名。1.1.3 是一种最...【详细内容】
2020-08-19  Tags: 冒泡排序  点击:(111)  评论:(0)  加入收藏
最近在招聘过程中,发现好多小伙伴最基础的一些算法回答,接下来会做一个系列,把基础的排序等算法采用动画的形式做解析。这是第一篇「冒泡排序」。 冒泡排序思想冒泡排序(Bubble...【详细内容】
2020-08-14  Tags: 冒泡排序  点击:(92)  评论:(0)  加入收藏
冒泡排序算法是依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经...【详细内容】
2020-05-03  Tags: 冒泡排序  点击:(52)  评论:(0)  加入收藏
根据维基百科:冒泡排序又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进...【详细内容】
2019-12-09  Tags: 冒泡排序  点击:(73)  评论:(0)  加入收藏
算法与数据结构构成了程序,数据结构用于实现数据的表示、存储、管理,算法通过使用数据完成一定的业务逻辑与操作,最终实现了程序的功能。因此算法在编程中的重要性是不言而喻的...【详细内容】
2019-10-30  Tags: 冒泡排序  点击:(73)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(9)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(19)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(13)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(37)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条