插入排序
-
插入排序
-
思路:
-
需要将原始序列分成两部分:有序部分,无序部分
-
将无序部分中的元素逐一插入到有序部分中
-
注意:初始情况下,有序部分为乱序序列的第一个元素,无序部分为乱序序列的n-1个元素
-
乱序序列:[3,8,5,7,6]
-
[3,8,,,,5,7,6]
-
[3,5,8,,,,7,6]
-
[3,5,7,8,,,,6]
-
[3,5,6,7,8,,,]
-
定义一个变量i,i表示的是有序部分元素的个数&无序部分第一个元素下标。
-
#step1:
#[31, 8,5,7,6]
i = 1 #i就是有序部分元素的个数&&无序部分第一个元素下标
#alist[i-1]:有序部分最后一个元素下标
#alist[i]:无序部分第一个元素下标
if alist[i-1] > alist[i]:
alist[i],alist[i-1] = alist[i-1],alist[i]
#[8,31, 5,7,6]
#step 2:[8,31, 5,7,6]
i = 2
#alist[i-1]:有序部分最后一个元素下标
#alist[i]:无序部分第一个元素下标
while i>0:
if alist[i-1] > alist[i]:
#循环第一次执行[8,5,31, 7,6]
alist[i-1],alist[i] = alist[i],alist[i-1]
i -= 1
#循环继续执行
#[5,8,31, 7,6]
else:
break
i = 3
#alist[i-1]:有序部分最后一个元素下标
#alist[i]:无序部分第一个元素下标
while i>0:
if alist[i-1] > alist[i]:
alist[i-1],alist[i] = alist[i],alist[i-1]
i -= 1
else:
break
#step 3:
#处理变量i,需要让i进行自己递增
for i in range(1,len(alist)): #i = 1,2,3,4
#alist[i-1]:有序部分最后一个元素下标
#alist[i]:无序部分第一个元素下标
while i>0:
if alist[i-1] > alist[i]:
alist[i-1],alist[i] = alist[i],alist[i-1]
i -= 1
else:
break
#完整代码
alist = [3,8,5,7,6]
def sort(alist):
for i in range(1,len(alist)):
while i>0:
if alist[i-1] > alist[i]:
alist[i-1],alist[i] = alist[i],alist[i-1]
i -= 1
else:
break
return alist
#
print(sort(alist))
[3, 5, 6, 7, 8]
总结:以上图为例,当你第一次外层循环时,i**为1(咱们设置的range(1,len(alist))), 索引 i-1 跟 i 比较,当 i-1的元素大于 i 的元素,交换位置。就变成5 8 4 11 10 ,然后i = 2时, i -1的元素就是索引为1,跟索引为2的比较,如果索引为1的大于为2的,继续交换位置,得到5 4 8 11 10 ,没完呢,然后让 i -1 ,循环继续让索引为0的元素跟刚交换完位置的索引变成1的元素比较,就是5 跟4 再比较,如果 索引为1的小于索引为0的,再交换位置,但是上图4小于5,所以会继续交换位置,得到4 5 8 11 10。如果不是就break,跳出循环。就这样前面的都是有序序列了,慢慢的都会变成全部有序。效率上比冒泡和选择快,为啥自己想。