直接插入排序——考研算法

一.基本原理

1.核心思想: 插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入 ,如此重复,直至完成序列排序。
在这里插入图片描述
2.算法分析:

  1. 从序列第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,设为待插入元素,在已经排序的元素序列中从后向前扫描,如果该元素(已排序)大于待插入元素,将该元素移到下一位置。
  3. 重复步骤2,直到找到已排序的元素小于或者等于待排序元素的位置,插入元素
  4. 重复2,3步骤,完成排序。

二.图例演示:

在这里插入图片描述
如上图所示,以一组数据{57,27,36,15,69,42} 为例,进行直接插入排序的算法演示:
默认序列第一个元素57 以及被排序。
取下一元素 27 从后往前与已排序序列一次比较, 27 插入57 之后,已排序序列为[27,57]
取下一元素36,重复2步骤,将3657之前,已排序序列为[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 算法稳定性:

插入排序是一种稳定的排序算法。

下一节预告

将讲解直接插入排序的改进算法——折半插入排序

猜你喜欢

转载自blog.csdn.net/Gnewocean/article/details/84886915