冒泡排序算法

唯思创JL创享编程

什么是冒泡排序算法

视频:冒泡排序算法演示

什么是冒泡排序算法

  1. 将从索引0和索引1的数据开始比较,如果前面一个数据大于后一个数据,那么将它们交换位置,一轮完成交换后的结果:[45, 89, 90, 34, 78, 23, 101]
  2. 从头开始比较,由于101已经排序好了,所以我们不需要对它进行排序,结果:[45, 89, 34, 78, 23, 90, 101]
  3. 不断重复进行,由于总共有7个数据,每次排序好一个数据,最后剩下的一个数据不需要进行排序,因此进行6轮排序即可,最后可以得到正确结果:[23, 34, 45, 78, 89, 90, 101]

列表数据:[45,101,89,90,34,78,23]

什么是冒泡排序算法

JL编程动画演示

实现算法

for i in range(len(List)-1):	#只需要比较6次,因此需要减1
	if List[i]>List[i+1]:
		List[i],List[i+1]=List[i+1],List[i]
print(List)

第一次排序

for i in range(len(List)-2):	#只需要比较5次,因此需要减2
	if List[i]>List[i+1]:
		List[i],List[i+1]=List[i+1],List[i]
print(List)

第二次排序

List=[45,101,89,90,34,78,23]

for j in range(len(List)-1):
	for i in range(len(List)-(j+1)):
		if List[i]>List[i+1]:
			List[i],List[i+1]=List[i+1],List[i]
	print(List)
	
# [45, 89, 90, 34, 78, 23, 101]
# [45, 89, 34, 78, 23, 90, 101]
# [45, 34, 78, 23, 89, 90, 101]
# [34, 45, 23, 78, 89, 90, 101]
# [34, 23, 45, 78, 89, 90, 101]
# [23, 34, 45, 78, 89, 90, 101]

总代码

优化算法

请看下面的代码

List=[45,23,89,90,34,78,23]

for j in range(len(List)-1):
	for i in range(len(List)-(j+1)):
		if List[i]>List[i+1]:
			List[i],List[i+1]=List[i+1],List[i]
	print(List)

# [23, 45, 89, 34, 78, 23, 90]
# [23, 45, 34, 78, 23, 89, 90]
# [23, 34, 45, 23, 78, 89, 90]
# [23, 34, 23, 45, 78, 89, 90]
# [23, 23, 34, 45, 78, 89, 90]
# [23, 23, 34, 45, 78, 89, 90]

缺点

  • 遇到已经排序好的情况,下面还会继续排序
  • 最后一次排序无效

改进

我们可以为代码添加一个变量,用于记录是否发生交换

List=[23,34,45,89,90,78,23]

for j in range(len(List)-1):
	isswap=False
	for i in range(len(List)-(j+1)):
		if List[i]>List[i+1]:
			isswap=True
			List[i],List[i+1]=List[i+1],List[i]
	if isswap==False:
		break
	print(List)

# [23, 34, 45, 89, 78, 23, 90]
# [23, 34, 45, 78, 23, 89, 90]
# [23, 34, 45, 23, 78, 89, 90]
# [23, 34, 23, 45, 78, 89, 90]
# [23, 23, 34, 45, 78, 89, 90]

封装成通用方法

def bubble_sort(List):
	for j in range(len(List)-1):
		isswap=False
		for i in range(len(List)-(j+1)):
			if List[i]>List[i+1]:
				isswap=True
				List[i],List[i+1]=List[i+1],List[i]
		if isswap==False:
			break


List1=[23,34,45,89,90,78,23]
List2=[45,12,90,3,34,67,45]

bubble_sort(List1)
bubble_sort(List2)

print(List1)
print(List2)

# [23, 23, 34, 45, 78, 89, 90]
# [3, 12, 34, 45, 45, 67, 90]

算法的时间比较

import random
import time

#冒泡排序算法
def bubble_sort(List):
	a=List
	for j in range(len(List)-1):
		isswap=False
		for i in range(len(List)-(j+1)):
			if List[i]>List[i+1]:
				isswap=True
				List[i],List[i+1]=List[i+1],List[i]
		if isswap==False:
			break
	return a

#选择排序算法
def sort_funtion(List):
	a=List
	for j in range(len(a)):
		minindex=j
		for i in range(j,len(a)):
			if a[i]<=a[minindex]:
				minindex=i
		temp=a[minindex]
		a[minindex]=a[j]
		a[j]=temp
	return a

List=[]
for i in range(5000):
	List.append(random.randint(1,10000))

start=time.time()
bubble_sort(List)
end=time.time()
print("冒泡排序算法用时:",end-start)


start=time.time()
sort_funtion(List)
end=time.time()
print("选择排序算法用时:",end-start)

# C:\Users\heyang\Desktop>test.py
# 冒泡排序算法用时: 3.482654571533203
# 选择排序算法用时: 1.14493989944458

# C:\Users\heyang\Desktop>test.py
# 冒泡排序算法用时: 3.4387686252593994
# 选择排序算法用时: 1.2476959228515625

综合练习

用冒泡排序的方法对图中的序列按从小到大进行排序,画图表示每一步的操作

47

13
13
49
7
import turtle

pen=turtle.Pen()
pen.pensize(3)

#冒泡排序算法
def bubble_sort(List):
	a=List
	for j in range(len(List)-1):
		isswap=False
		for i in range(len(List)-(j+1)):
			if List[i]>List[i+1]:
				isswap=True
				List[i],List[i+1]=List[i+1],List[i]
		if isswap==False:
			break
		drawing(a)
	return a
#定义绘制图形的代码
def drawing(List):
	for i in range(len(List)):
		pen.forward(List[i])
		pen.setheading(180)
		pen.forward(List[i])

		pen.penup()
		pen.setheading(270)
		pen.forward(10)
		pen.pendown()
		pen.setheading(0)
	pen.penup()
	pen.setheading(270)
	pen.forward(20)
	pen.pendown()
	pen.setheading(0)

List=[47,13,13,49,7]
bubble_sort(List)

turtle.done()

冒泡排序算法

By yang he

冒泡排序算法

  • 243