1.思想
哨兵 有序区 待排元素 无序区
a[0] a[1...i-1] a[i] a[i+1...n]
插入排序的思想是每次从无序区按序摘出一个待排元素,然后待排元素与有序区的元素从后向前开始比较,边比较边移动,直到找到不比待排元素大的第一个元素,插在该元素的后面。
2.用c实现
// a[0]作为哨兵仅辅助排序,不是待排序列中的元素
void insertSort(int *a, int n){
int i, j;
for(i=2; i<n; i++){
if(a[i]<a[i-1]){
a[0] = a[i];
// 减少j与下界的一次比较
for(j=i-1; a[0]<a[j];--j)
a[j+1] = a[j];
a[j+1] = a[0];
}
}
}
3.用python实现
import numpy as np
# 哨兵对于python无作用,所以这边不用哨兵的方式
def insertSort(a):
j = 0
# for i 不取右界的数
for i in range(1, len(a)):
if a[i] < a[i-1]:
value = a[i]
# for中取减序,需要标志为-1
for j in range(i-1, -1, -1):
if value < a[j]:
a[j+1] = a[j]
else:
break
a[j+1] = value
# print(a)