python实战练手项目---用pygame模拟展示冒泡排序过程

1. 冒泡排序

冒泡排序是八大排序算法之一,虽然很简单,但在招聘面试时,却经常被提问,因为这个算法可以快速检测一个应试者的算法功底。

初学者在学习排序算法时,最大的困难在于理解算法计算的过程,纯粹的通过嵌套循环的逻辑来理解算法,多少是有一些难度的,网上有一些动态gif图片可以模拟展示排序过程,受此启发,我决定用pygame来模拟展示排序过程,今天先用冒泡来试试手

2. pygame

PyGame是一个用Python写的SDL库。SDL是一个能访问计算机多媒体硬件组件(包括声卡,视频卡,输入组件等)的跨平台库。仅从名字上,你就能猜测出这个库用来编写游戏,对于这个库,我了解的也并不多。为了写这个程序,也只好从头开始学习,一路磕磕绊绊,最好好歹是实现了排序过程的模拟

3. 基本设计思路

冒泡排序

3.1 柱状图

为了展示出动画,需要将待排序的数据以柱状图的形式展示在界面上。同一个数据有3种状态,粉色的是等待排序的数据,绿色的是正在进行比较的数据,蓝色的是已经被排序好的数据。

柱状图,我用图片来实现,为此我写了两个函数,专门用来生成图片,同一个数据,生成3张图片

from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw


def create_pic(index, value, color, pic_type):
    high = value * 5
    image = Image.new('RGB', (40, high), color)
    draw = ImageDraw.Draw(image)
    # 获取一个font字体对象参数是ttf的字体文件的目录,以及字体的大小
    font=ImageFont.truetype(font='/Library/Fonts/Microsoft/Microsoft Yahei.ttf', size=15)
    # 在图片上写东西,参数是:定位,字符串,颜色,字体
    draw.text((10, high-20), str(value), (53, 53, 54), font=font)
    # 保存到硬盘,名为test.png格式为png的图片
    name = "pic/{index}_{pic_type}.png".format(index=index, pic_type=pic_type)
    image.save(open(name,'wb'), 'png')
    return name


def create_three_pic(index, value):
    clutter_pic = create_pic(index, value, (246, 214, 255), 'clutter')
    compare_pic = create_pic(index, value, (81, 255, 0), 'compare')
    sort_pic = create_pic(index, value, (0, 60, 255), 'sort')
    return clutter_pic, compare_pic, sort_pic

3.2 封装数据

这个程序既要实现冒泡排序,又要在排序的过程中对图片进行移动,必须使用面向对象的技术对待排序数据进行封装,这样操作起来比较容易

lst = [10, 66, 50, 35, 60, 44, 55, 20, 70, 15]


class SortItem(object):
    def __init__(self, index, value):
        clutter_pic, compare_pic, sort_pic = create_three_pic(index, value)
        self.clutter_pic = pygame.image.load(clutter_pic)
        self.compare_pic = pygame.image.load(compare_pic)
        self.sort_pic = pygame.image.load(sort_pic)
        self.value = value
        self.state = 0  # 0表示无序, 1表示处于比较状态, 2表示已经有序

    def __ge__(self, other):
        return self.value > other.value

    def __str__(self):
        return str(self.value)

sort_lst = []
for index, value in enumerate(lst):
    sort_lst.append(SortItem(index, value))

3.3 动画过程

我对动画过程的设计比较简单,每一次数据位置改变后,都重新绘制界面,在交换数据时,进行精细的绘制以达到动画的效果

4. 获取代码

代码较长,不方便粘贴在文章里,需要代码,可以关注我的公众号,回复 冒泡 即可获得源码
酷python

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案