每次将一个待排序的记录,按其关键字大小,插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。
分类
根据寻找插入位置方法分为
- 直接插入排序
- 折半(二分)插入排序
- 希尔插入排序
直接插入排序
基本思想
当插入第]插入,原来位置上的对象向后顺移。
直接插入排序图示
从上到下,分别展示了直接排序算法的所有可能的过程,包括相同排序码的排序方式(保持了原来的顺序,说明是稳定排序)以及in-place操作中的元素移动等。
直接插入排序算法分析
设待排序对象个数为1趟排序码比较次数和对象移动次数与对象排序码的初始排列有关。
- 最好情况下,排序前对象已经按照要求的有序。比较次数(KCN):)。
- 最坏情况下,排序前对象为要求的顺序的反序。第i个对象都做排序码比较,并且每做1次比较就要做1次数据移动(具体可以从下面给出的代码中看出)。
- )。
- 如果排序记录是随机的,那么根据概率相同的原则,在平均情况下的排序码比较次数和对象移动次数约为)。
直接插入排序算法的特点
- 它是稳定排序,不改变相同元素原来的顺序。
- 它是in-place排序,只需要)的额外内存空间。
- 它是在线排序,可以边接收数据边排序。
- 它跟我们牌扑克牌的方式相似。
- 对小数据集是有效的。
直接插入排序伪代码
for j=2 to A.length
key = A[j]
i = j-1
while i>0 and A[i]>key
A[i+1] =A[i]
i = i-1
A[i+1] = key
直接插入排序C代码
for(j=1;j<n;j++) { key = A[j]; for(i=j-1;i>=0&&A[i]>key;i--) A[i+1] = A[i]; A[i] = key; }