Insert Sort
演示一下:
# 有这样一个无序列表,我们运用插入排序的方法来给它做升序排序
[9,4,3,7,6,1,8,2,5]
# 首先,我们把这个列表想像成一组牌,第一个的 9 是我们手上的(有序区),其余是要摸的(无序区),为了区分,在有序区于无序区之间搞一个分隔符
[9,'|', 4, 3, 7, 6, 1, 8, 2, 5]
# 我们第一张要摸的牌是 4 ,9比4大,所以,4应该放在9的左边,又因为9的旁边没有位置,所以9要向右移一个位置
[4, 9,'|', 3, 7, 6, 1, 8, 2, 5]
# 往后都是同样的道理,遇到大的,大的就往右移一个位置,遇到小的,就插在小的数的右边
[3, 4, 9,'|', 7, 6, 1, 8, 2, 5]
[3, 4, 7, 9,'|', 6, 1, 8, 2, 5]
[3, 4, 6, 7, 9, '|',1, 8, 2, 5]
[1, 3, 4, 6, 7, 9, '|',8, 2, 5]
[1, 3, 4, 6, 7, 8, 9, '|',2, 5]
[1, 2, 3, 4, 6, 7, 8, 9, '|',5]
[1, 2, 3, 4, 5, 6, 7, 8, 9,'|',]
代码如下:
def Insert_sort(list):for i in range(1,len(list)): # 趟数temp = list[i] # 记录每趟无序区的第一个数j = i-1 # 有序区的最后一个数的下标while j >= 0 and list[j] > temp: # 控制是否移动list[j+1] = list[j] # 把前一个数赋值给后一个j -= 1 list[j+1] = temp # 停下后把值插到小的数的右边return list
-----------------------------------------------
list3 = [9,4,3,7,6,1,8,2,5]
print(Insert_sort(list3))-------------->[1,2,3,4,5,6,7,8,9]
-
外层循环表示趟数,因为开始就设定列表第一个元素是有序区,其余为无序区,从无序区拿第一个元素与有序区逐个比较,所以趟数从1开始,
-
第三行:因为后续要将大的数向后移动一个位置,在实际代码中是把前一个数赋值给后一个数,我们需要一个变量来记录无序区的第一个数,防止被覆盖。
-
第四行:j 代表有序区的最后一个数的下标,因为比较大小是从有序区的末尾开始往前比较的:遇到大的,大的就往后移;遇到小的,temp就放在小的数的右边
-
第五行:这里有三种情况:
1:有序区末尾的数比无序区第一个数还小,不用插;
2:在中间时,停在小的数的右边
3:当比较完整个有序区,如:j == 0时,list[j]还是比此时的list[i]还要大,那么还要执行一次 j-1 ,j == -1,因为列表没有list[-1]这个数,所以需要用 j >= 0来控制循环的结束
-
时间复杂度:O(n的平方)