一.基本原理
1.核心思想: 插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入 ,如此重复,直至完成序列排序。
2.算法分析:
- 从序列第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,设为待插入元素,在已经排序的元素序列中从后向前扫描,如果该元素(已排序)大于待插入元素,将该元素移到下一位置。
- 重复步骤2,直到找到已排序的元素小于或者等于待排序元素的位置,插入元素
- 重复2,3步骤,完成排序。
二.图例演示:
如上图所示,以一组数据{57,27,36,15,69,42}
为例,进行直接插入排序的算法演示:
默认序列第一个元素57
以及被排序。
取下一元素 27
从后往前与已排序序列一次比较, 27
插入57
之后,已排序序列为[27,57]
。
取下一元素36
,重复2步骤,将36
插57
之前,已排序序列为[27,36,57]
。
循环上述操作,直至最后一个元素42
,插入合适位置,完成排序。
三.代码实现
void insertSort(RedType L , int n)
{ int i ,j;
for(i=2; i<=n; i++) /*需要n-1趟*/
if(L[i].key<L[i-1].key)
{ L[0]=L[i]; /* 作为监视哨*/
for( j=i-1; L[0].key<L[j].key; j )
L[j+1]=L[j]; /* 记录后移*/
L[j+1]=L[0]; /* 插入 */
}
四.性能分析
1 时间复杂度:
(1)顺序排列时,只需比较(n-1)次,插入排序时间复杂度为O(n);
(2)逆序排序时,需比较n(n-1)/2次,插入排序时间复杂度为O(n^2);
(3)当原始序列杂乱无序时,平均时间复杂度为O(n^2)。
2 空间复杂度:
插入排序过程中,需要一个临时变量temp存储待排序元素,因此空间复杂度为O(1)。
3 算法稳定性:
插入排序是一种稳定的排序算法。
下一节预告
将讲解直接插入排序的改进算法——折半插入排序。