python写冒泡排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python写冒泡排序相关的知识,希望对你有一定的参考价值。
参考技术A 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
中文名
冒泡排序
外文名
Bubble Sort
所属学科
计算机科学
时间复杂度
O(n2)
算法稳定性
稳定排序算法
快速
导航
算法分析算法描述优化算法比较
算法原理
冒泡排序算法的原理如下:[1]
比较相邻的元素。如果第一个比第二个大,就交换他们两个。[1]
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。[1]
针对所有的元素重复以上的步骤,除了最后一个。[1]
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
用Turtle库写一个冒泡排序动画演示
* 题目 *
中国电子学会的青少年Python三级考试中,基本算法是一个重点,涉及到解析算法、枚举算法、排序算法、查找算法,而其中排序算法就有“冒泡排序”、“选择排序”、“插入排序”、“快速排序”。
网上有不少排序的动画,能够让学生形象地看到排序算法是如何对数列中的元素进行比较、交换从而实现排序的。我们是否可以用Python一、二级的知识,用Turtle库来实现同样的演示呢?
* 分析 *
Turtle库本身就是Python中自带的一种简单的绘图库,最简单的方法,我们可以用粗线来表示数值大小,用不同颜色表示操作。
我们尽可能不超纲地用Python三级前的知识点来完成一个排序算法的动画演示,超出范围的主要是def自定义函数为Python四级内容,此外导入了random库,使用shuffle函数来实现序列元素的随机排序。
以下参考程序演示中颜色说明:
黑色,未完成排序的元素;
蓝色,比较且顺序正确不用交换的元素;
红色,比较且顺序错误进行交换的元素;
绿色,已完成排序的元素。
* 执行效果 *
* 参考程序 *
import random
import turtle
list_len = int(input('请输入排序数列长度(建议<=20):'))
list_sort = list(range(1,list_len + 1))
random.shuffle(list_sort)
print(list_sort)
turtle.setup(800, 600)
turtle.screensize(790, 590)
if list_len < 2:
print('数列长度不能<2')
exit()
else:
interval = 700 / list_len
line_len = 500 / list_len / 2
pen_size = 700 / list_len / 5
t = turtle.Turtle()
t.hideturtle()
t.setheading(90)
t.speed(0)
t.pensize(pen_size)
posx_init = - interval * (list_len - 1) / 2
def draw_line(index, lnum, color):
posx = posx_init + interval * index
t.penup()
t.goto(posx, -150)
t.pendown()
t.pencolor(color)
t.forward(line_len * lnum)
t.penup()
t.goto(posx + 1, t.ycor()+50)
t.pendown()
t.pencolor('white')
t.dot(20)
t.goto(posx - 3, t.ycor()-10)
t.pencolor(color)
t.write(lnum)
t.penup()
t.goto(-330, 220)
t.pendown()
t.write('冒泡排序过程动画演示\n\n原始数列:{}'.format(list_sort))
for li, lo in enumerate(list_sort):
draw_line(li, lo, 'black')
count_comp = 0
count_exch = 0
for li in range(list_len - 1):
for lc in range(list_len - 1 -li):
count_comp += 1
if list_sort[lc] > list_sort[lc+1]:
count_exch += 1
draw_line(lc, list_sort[lc], 'red')
draw_line(lc+1, list_sort[lc+1], 'red')
draw_line(lc, list_sort[lc], 'white')
draw_line(lc+1, list_sort[lc+1], 'white')
list_sort[lc], list_sort[lc+1] = list_sort[lc+1], list_sort[lc]
else:
draw_line(lc, list_sort[lc], 'blue')
draw_line(lc+1, list_sort[lc+1], 'blue')
draw_line(lc, list_sort[lc], 'black')
draw_line(lc+1, list_sort[lc+1], 'black')
draw_line(lc+1, list_sort[lc+1], 'green')
print(list_sort)
draw_line(lc, list_sort[lc], 'green')
t.penup()
t.goto(-330, -220)
t.write('操作统计:比较%d次,交换%d次。' % (count_comp, count_exch))
turtle.done()
以上是关于python写冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章