冒泡排序是八大排序算法之一,虽然很简单,但在招聘面试时,却经常被提问,因为这个算法可以快速检测一个应试者的算法功底。
初学者在学习排序算法时,最大的困难在于理解算法计算的过程,纯粹的通过嵌套循环的逻辑来理解算法,多少是有一些难度的,网上有一些动态gif图片可以模拟展示排序过程,受此启发,我决定用pygame来模拟展示排序过程,今天先用冒泡来试试手
PyGame是一个用Python写的SDL库。SDL是一个能访问计算机多媒体硬件组件(包括声卡,视频卡,输入组件等)的跨平台库。仅从名字上,你就能猜测出这个库用来编写游戏,对于这个库,我了解的也并不多。为了写这个程序,也只好从头开始学习,一路磕磕绊绊,最好好歹是实现了排序过程的模拟
为了展示出动画,需要将待排序的数据以柱状图的形式展示在界面上。同一个数据有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
这个程序既要实现冒泡排序,又要在排序的过程中对图片进行移动,必须使用面向对象的技术对待排序数据进行封装,这样操作起来比较容易
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))
我对动画过程的设计比较简单,每一次数据位置改变后,都重新绘制界面,在交换数据时,进行精细的绘制以达到动画的效果
代码较长,不方便粘贴在文章里,需要代码,可以关注我的公众号,回复 冒泡 即可获得源码
QQ交流群: 211426309