直接插入排序(Straight Insertion Sort)
基本思想
- 往已有的有序序列中插入需要排序的值
- 已排序完毕的数列是有序的
- 将第一个元素看做一个有序的序列,从第二个元素开始一直往前插入排序
- 每次插入得到元素个数加1的新序列
- 如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,保证插入排序是稳定的
def insert_sort(arr):
n = len(arr)
for i in range(1,n):# 如果大于arr[i-1]就就直接插在最后开始下一个
if arr[i]<arr[i-1]: #将第i个元素与前一个已排好序列的最后一个比较
j = i - 1
temp = arr[i] # 记录当前待排序的元素
arr[i] = arr[i-1] # 将待排序元素向前移动一位
while temp<arr[j] and j>=0: # 判断待排序元素与前一位的大小,由于Python的列表存在负索引,这里要判断j>=0
arr[j+1] = arr[j] #元素后移
j = j -1
arr[j+1] = temp # 插入
showarr(arr,i) # 打印每一趟排序的结果
def showarr(arr,i):
print("第"+str(i)+"次:",end='')
n = len(arr)
for j in range(n):
print(arr[j],end=' ')
print('\n')
def test():
arr = [4,6,2,3,6,7,8,1,16,5]
insert_sort(arr)
if __name__ == '__main__':
test()
每次比较的时候与前面排好序的序列的最后一个元素开始比较,比它大就开始下一个排序,比它小则继续往前比较,找到>=的位置插入