插入排序算法

唯思创JL创享编程

什么是插入排序

扑克牌动画演示

假设有这样一个列表:[45,12,34,5,23,56]

插入排序会怎么排序呢?

插入排序动画演示

实现算法

第一轮实现

List=[45,12,34,5,23,56]
number=List[1]				#将第二个数据提取出来
for i in range(1,-1,-1):	#i从1开始,一直到0
	if number<List[i-1]:	#如果第i-1个数据小于number,就将第i-1个数据向挪动,否则退出循环
		List[i]=List[i-1]
	else:
		break
List[i]=number
print(List)
#[12, 45, 34, 5, 23, 56]

第二轮实现

List=[12,45,34,5,23,56]		#上一轮排序的结果
number=List[2]				#将第二个数据提取出来
for i in range(2,-1,-1):	#i从2开始,一直到0
	if number<List[i-1]:	#如果第i-1个数据小于number,就将第i-1个数据向挪动,否则退出循环
		List[i]=List[i-1]
	else:
		break
List[i]=number
print(List)
#[12, 34, 45, 5, 23, 56]

第三轮实现

List=[12,45,34,5,23,56]		#上一轮排序的结果
number=List[3]				#将第二个数据提取出来
for i in range(3,-1,-1):	#i从2开始,一直到0
	if number<List[i-1]:	#如果第i-1个数据小于number,就将第i-1个数据向挪动,否则退出循环
		List[i]=List[i-1]
	else:
		break
List[i]=number
print(List)
#[12, 34, 45, 5, 23, 56]

第四轮实现

List=[12,45,34,5,23,56]		#上一轮排序的结果
number=List[4]				#将第二个数据提取出来
for i in range(4,-1,-1):	#i从2开始,一直到0
	if number<List[i-1]:	#如果第i-1个数据小于number,就将第i-1个数据向挪动,否则退出循环
		List[i]=List[i-1]
	else:
		break
List[i]=number
print(List)
#[12, 34, 45, 5, 23, 56]

总代码

List=[45,12,34,5,23,56]

for j in range(1,len(List)):	#从j从1-5
	number=List[j]				#将第二个数据提取出来
	for i in range(j,-1,-1):	#i从j开始,一直到0
		if number<List[i-1]:	#如果第i-1个数据小于number,就将第i-1个数据向挪动,否则退出循环
			List[i]=List[i-1]
		else:
			break
	List[i]=number
	print(List)
	
# [12, 45, 34, 5, 23, 56]
# [12, 34, 45, 5, 23, 56]
# [5, 12, 34, 45, 23, 56]
# [5, 12, 23, 34, 45, 56]
# [5, 12, 23, 34, 45, 56]

封装成通用方法

对列表进行复制

List=[1,2,3,4]

List2=List[:]	#复制一个列表
List2[1]=0

print(List)
print(List2)

# [1, 2, 3, 4]
# [1, 0, 3, 4]

封装代码

List=[45,12,34,5,23,56]

def insert_sort(List_a):
	List=List_a[:]					#复制列表
	for j in range(1,len(List)):	#从j从1-5
		number=List[j]				#将第二个数据提取出来
		for i in range(j,-1,-1):	#i从j开始,一直到0
			if number<List[i-1]:	#如果第i-1个数据小于number,就将第i-1个数据向挪动,否则退出循环
				List[i]=List[i-1]
			else:
				break
		List[i]=number
	return List

List1=insert_sort(List)

print(List1)
print(List)
# [5, 12, 23, 34, 45, 56]
# [45, 12, 34, 5, 23, 56]

折半插入排序

动画演示

List=[5, 12, 34, 45, 23, 56]

number=List[4]
low=0
high=4

while low<high:
	if number > List[(low+high)//2]:
		low=(low+high)//2+1
	else:
		high=(low+high)//2

List.pop()
List.insert(low,number)

print(List)

#[5, 12, 23, 34, 45, 23]

折半插入

List=[45,12,34,5,23,56]

for j in range(1,len(List)):
	number=List[j]
	low=0
	high=j

	while low<high:
		if number > List[(low+high)//2]:
			low=(low+high)//2+1
		else:
			high=(low+high)//2

	List.pop(j)
	List.insert(low,number)

	print(List)

# [12, 45, 34, 5, 23, 56]
# [12, 34, 45, 5, 23, 56]
# [5, 12, 34, 45, 23, 56]
# [5, 12, 23, 34, 45, 56]
# [5, 12, 23, 34, 45, 56]

总代码

综合练习

按照插入排序算法的思想,定义函数使其可以按照从大到小的顺序对序列进行排序

List=[45,12,34,5,23,56]

for j in range(1,len(List)):	#从j从1-5
	number=List[j]				#将第二个数据提取出来
	for i in range(j,-1,-1):	#i从j开始,一直到0
		if number>List[i-1]:	#如果第i-1个数据小于number,就将第i-1个数据向挪动,否则退出循环
			List[i]=List[i-1]
		else:
			break
	List[i]=number
	print(List)
	
# [45, 12, 34, 5, 23, 56]
# [45, 34, 12, 5, 23, 56]
# [45, 34, 12, 5, 23, 56]
# [45, 34, 23, 12, 5, 56]
# [56, 45, 34, 23, 12, 5]

用while循环替换本节课自定义函数中的内层for循环,完成插入排序的功能

List=[45,12,34,5,23,56]

for j in range(1,len(List)):	#从j从1-5
	number=List[j]				#将第二个数据提取出来

	i=j
	while i>0:
		if number<List[i-1]:	#如果第i-1个数据小于number,就将第i-1个数据向挪动,否则退出循环
			List[i]=List[i-1]
		else:
			break
		i=i-1
	List[i]=number
	print(List)
	
# [12, 45, 34, 5, 23, 56]
# [12, 34, 45, 5, 23, 56]
# [5, 12, 34, 45, 23, 56]
# [5, 12, 23, 34, 45, 56]
# [5, 12, 23, 34, 45, 56]

修改封装函数,让用户能够定义是从小到大,还是从大到小

List=[45,12,34,5,23,56]

def insert_sort(List_a,x):
	List=List_a[:]					#复制列表
	for j in range(1,len(List)):	#从j从1-5
		number=List[j]				#将第二个数据提取出来
		for i in range(j,-1,-1):	#i从j开始,一直到0
			if x==1:
				if number<List[i-1]:	#如果第i-1个数据小于number,就将第i-1个数据向挪动,否则退出循环
					List[i]=List[i-1]
				else:
					break
			else:
				if number>List[i-1]:	#如果第i-1个数据小于number,就将第i-1个数据向挪动,否则退出循环
					List[i]=List[i-1]
				else:
					break				
		List[i]=number
	return List

List1=insert_sort(List,1)	#从小到大
List2=insert_sort(List,0)	#大到小

print(List1)
print(List2)
print(List)
# [5, 12, 23, 34, 45, 56]
# [56, 45, 34, 23, 12, 5]
# [45, 12, 34, 5, 23, 56]

插入排序算法

By yang he

插入排序算法

  • 268