范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

5种python方法实现冒泡排序可视化BubbleSortVisualizer

  1 说明:
  =====
  1.1 冒泡排序:
  1.1.1 原理:比较两个相邻的元素,将值大的元素交换至右端。
  1.1.2 来源:由来是因为越大的元素会经由交换慢慢"浮"到数列的顶端,故得名。
  1.1.3 是一种最简单直观的排序算法之一。
  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 效果图:
  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 效果图:
  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 效果图:
  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 效果图:
  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 效果图:
  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()
  ===自己整理并分享出来===
  喜欢的人,请点赞、关注、评论、转发和收藏。

5岁的孩子枯瘦如柴,靠挂水维持生命,他要吃东西却被妈妈阻止孩子是祖国的未来,每个家庭都有自己孩子的存在,孩子是父母的希望,孩子给家庭带来幸福欢乐,如果一个家庭没有孩子,就会感到孤独寂寞,没有一点生机,这个家庭就不完整。因此孩子对于一个家庭凌晨1点,4岁孩子背不出课文妈妈狂扇自己耳光这种教育方式有毒!前段时间,因为一档综艺节目,内疚式教育这个词儿上了热搜。节目中这位妈妈自称是一个完美主义者,有一次,四岁的女儿有一个作业要背,重复了很多次都没有记下来。那个时候已经耗到夜里十二点一宝宝吸不干净后果很严重新手妈妈一定不要偷懒,最起码每天宝宝吃完了要吸奶器排空一次,我是宝宝五个月才乳腺炎发烧的,后来才知道一直都有轻微的乳腺炎,就是每次半夜胸部都热热的,一直都以为是涨奶,白天宝宝吃了就把儿子养成妈宝男,只需妈妈的3个行为,对孩子没什么好处中国很多的爸爸相对疼爱女儿,不可忽视妈妈也同样疼爱儿子。妈妈长时间对儿子的宠爱上升到一定的溺爱程度,会让儿子对妈妈产生精神依赖。这种过于依赖妈妈的男生就会对妈妈产生一种畸形的感觉,婴儿洗衣液哪种最安全?难怪宝妈们都说别买婴儿洗衣液婴儿洗衣液这东西真的是有个很多雷区。我买了很多种,踩了不少雷。本来呢,买婴儿洗衣液的初衷就是怕大人的洗衣液化学成分太多,想着婴儿洗衣液能温和一些。但我试有无缺铁或缺铁性贫血检查,可以提前在备孕期检查,为什么呢?女性有无缺铁或者是缺铁性贫血,通常这个检查多数是在女性孕期的时候才开始进行的,把这个检查提前到备孕期,女性如果是出现了缺铁或者是缺铁性贫血的,就可以在医生的指导下及时地把铁补充到正家中常见的这三种饮品,都是孩子成长路上的绊脚石亲贝网小编了解到,孩子的身高受到诸多方面因素的影响,除了先天遗传基因外,后天的营养物质摄入和脾胃健康程度,都会影响到孩子的成长发育。像这几种饮料,很多父母都喜欢给孩子买来喝,实际上遇上个不知道看家长脸色行事的孩子,属不属于呆板的小孩,闹心我家的皮孩子就不知道看我的脸色行事,呆板,尤其训他的时候,他就更呆了,看他那个呆板的样子,我就更加生气,我一生气,就更加想训他。越训他,他就越呆板,恶性循环。我特别希望他灵活一些,小时候老实长大后没出息?成大事的孩子,也会有几种胆小的行为文丨木莲妈妈,原创内容常言道三岁看大七岁看老。一个孩子长大后的状态如何,似乎从小就能判断出大概。生活中,人们往往喜欢通过一个孩子的长相性格等方面来判断孩子的发展趋势,一旦孩子表现得怀孕期间,孕妈身上的五种表现,是胎儿在报平安,家长要有数文贝贝豆育儿课堂(原创文章,欢迎转载分享)俗话说怀胎十月,一朝分娩。对于孕妈来说,十个月不光是身体上的折磨和磨难,更有精神上的折磨和煎熬。毕竟谁也不知道肚子里的这个小家伙到底是不是27月龄宝宝发育对照标准(036逐月分解系列)您的孩子已经27个月大了!不知你是否注意到您的孩子在家和出门表现不同?比如他平时很外向活泼,当有陌生人在的时候就躲在你的腿后面。或者她在托班是个小天使,在家里是个捣蛋鬼。在这个年龄
19道蒸菜月子餐,深受宝妈喜爱月子餐总是用油炒菜,不仅月嫂会吸进去不少油烟,而且食材的营养也在高温下流失不少。蒸菜则不同,更完整地保留了食物的滋味和营养,尤其适合产后坐月子食用,原汁原味不说,做起来还简单!1白23条坐月子经验,教你如何舒适的坐月子坐月子听谁的?听婆婆妈妈的老规矩?NO!NO!NO!想要科学坐月子必须听医生的!下面总结了23条经验,涵盖了月子期间的饮食运动环境卫生母乳奶水充足食物禁忌等等,非常全面,建议各位孕夏季孩子没胃口不爱吃饭怎么办?饮食搭配要调整,营养健康不能少文咩小胖立夏以后气温逐渐升高,天气一热就容易没有胃口。但是对于处于生长期的孩子来说,一旦食量有所减少,家长就会担心影响到孩子长身体。在夏季孩子的饮食问题上,最重要的一点就是如何帮助10岁男孩出村就昏睡,被质疑装睡,家庭教育有问题多是缺乏信任这几天一直在关注一个河南10岁的小男孩,孩子父母说只要一出村,孩子就会突然晕倒,昏睡过去。电视台的记者带着孩子做了好几次实验,不管是蒙眼走,还是玩着手机走,只要走出村子就秒睡。每次夏季影响孩子食欲的错误做法,家长要避免,吃得对比吃得多更重要文咩小胖最近一直处于高温的天气,跟不少宝妈在聊天的时候都提到了孩子的饮食问题,不知孩子的食欲不太好该怎么办。天气一热,确实会影响到孩子的食欲。但是在夏季孩子出现食欲不佳的问题,不仅陌生女子当街抢男孩,被9岁姐姐阻拦还打人,儿童防拐别忽视细节文咩小胖4月6日晚在郑州街头,出现了疑似人贩子抢孩子的惊险一幕。一位女子上前拉住一个男孩的手,要把男孩带走,男孩9岁的姐姐拽着弟弟大声喊这是我的弟弟。这女子十分嚣张地说这是我的孩子幼儿园萌娃采花送老师当清明节礼物,清明节的习俗,要让孩子明白春日亲子时光文咩小胖看到一个视频,一位幼儿园的小朋友在户外活动的时候,采了一朵花送给自己的老师。正当老师感动的时候,问小朋友为什么给自己送花。小朋友真诚地说,因为清明节快到了。老师奥运首金杨倩的清华学霸标签,是捧杀吗?两方面让人望尘莫及文喵喵萌宝教育记(原创文章,欢迎转载分享)近日在东京奥运会上,00后小将杨倩在东京奥运会赛场上大放光芒。一时间,每个中国观众都记住了这位性格沉稳头扎着胡萝卜皮筋戴着小熊发卡的姑娘。高考取消英语已经板上钉钉?专家的解释,让家长松了一口气文喵喵萌宝教育记(原创文章,欢迎转载分享)作为高考中分值高达150分的三大主科之一,英语在当前考试环境中的重要性显而易见。可和英语在校园内的大受追捧所不同的是,英语在社会生活中的地看到闺蜜的月子餐,真想重新坐月子,月子餐也能兼顾美味和营养文咩小胖闺蜜家的宝宝出生20天了,没见她晒娃,却经常晒出自己的月子餐。看着闺蜜晒出的色香味俱全的月子餐,我甚至有种想重新坐一次月子的冲动。回想自己坐月子的经历,因为宝宝比较省事,月百强中学排行榜榜首一本率高达99。5,散装江苏无一校入选文喵喵萌宝教育记(原创文章,欢迎转载分享)俗话说高考是千军万马过独木桥。其中,高中的实力就是就是决定孩子能否顺利走过高考这座独木桥的关键因素。为了能让自己的孩子进入重点高中,家长们