python3冒泡排序动态演示_作者:李兴球

版权声明:所有文章皆为李兴球先生原创,转载请注明出处,否则保留权利,追究责任。 https://blog.csdn.net/avskya/article/details/82958907

"""用python3的海龟画图模块制作的动态演示冒泡排序算法,作者:李兴球"""

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

class Column(Turtle):
    def __init__(self,x):
        Turtle.__init__(self,shape='square')
        """形状square的初始大小为20x20,所以半高就是10"""        
        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)                   #相对于自身坐标系前进的垂直方向放大
        """10*self.scale是柱子的半高,往下移屏幕半高,再抬高自身高一半加30,让所有柱子和屏幕底边对齐"""
        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("冒泡排序动态演示,作者:李兴球 2018/10/1")
    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:
        
        排序了吗 = 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坐标
                
                排序了吗 = True
            screen.update()
            sleep(0.1)
            
        length = length - 1               
        if  排序了吗 == False:break       #如果一次都没有排序,则退出while循环
        
         
        
                
            
            
 

猜你喜欢

转载自blog.csdn.net/avskya/article/details/82958907
今日推荐