插入排序算法

唯思创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