经典排序算法 – 插入排序 Insertion sort

Posted Nchusoftacm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典排序算法 – 插入排序 Insertion sort相关的知识,希望对你有一定的参考价值。

前面介绍了冒泡排序和选择排序,这次我们就给大家介绍一下插入排序吧。

插入排序的基本思想是:每步将一个待排序的数据,按其大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。基本思想是:把待排序的元素按其大小逐个插入到一个已经排好序的有序序列中,直到所有的元素插入完,即排序完成,得到一个新的有序序列。算法适用于少量数据的排序,时间复杂度O(n^2)。是稳定的排序方法。

通俗的说,插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中......N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。面以对6个数据从小到大排序为例详细介绍一下选择排序的过程。

 

原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |

 

第一次,将6看成是已经完成排序的数组,将2看成的待插入的元素,因为6>2,所以将6向后移一位(为2空出位置),再将2移至标记位置(6的前面一位)

 

交换前状态6 | 2 | 4 | 1 | 5 | 9 |

交换后状态2 | 6 | 4 | 1 | 5 | 9 |

 

第二次,将2 6两个元素看成是已经完成排序的数组,将4看成的待插入的元素,因为6>4,而2<4,所以4应该插在26之间,所以将6向后移一位(为元素4空出位置),再将4移至标记位置(26之间)

 

交换前状态2 | 6 | 4 | 1 | 5 | 9 |

交换后状态2 | 4 | 6 | 1 | 5 | 9 |

 

第三次,将2 4 6两个元素看成是已经完成排序的数组,将1看成的待插入的元素,因为6>14>12>1,所以1应该插在2之前,所以将2 4 6三个元素都向后移一位(为元素1空出位置),再将1移至标记位置(2之前)

 

交换前状态2 | 4 | 6 | 1 | 5 | 9 |

交换后状态1 | 2 | 4 | 6 | 5 | 9 |

 

第四次,将1 2 4 6两个元素看成是已经完成排序的数组,将5看成的待插入的元素,因为6>54<5,所以5应该插在46之间,所以将6向后移一位(为元素5空出位置),再将5移至标记位置(46之间)

 

交换前状态2 | 4 | 6 | 1 | 5 | 9 |

交换后状态1 | 2 | 4 | 5 | 6 | 9 |

 

第五次,将1 2 4 5 6两个元素看成是已经完成排序的数组,将9看成的待插入的元素,因为6<9,所以9应该插在6之后,所以9不移动

 

交换前状态2 | 4 | 6 | 1 | 5 | 9 |

交换后状态1 | 2 | 4 | 5 | 6 | 9 |

 

至此插入排序完成,代码仅供参考:

#include<stdio.h>
int main()
{
 int temp,n,i,j,k;
 scanf("%d",&n);
 int a[n];
 for (i=0;i<n;i++)
 scanf("%d",&a[i]);
 for (i=1;i<n;i++)
 {
  j=0;
  //寻找插入位置并标记为j
  for (j=0;j<i;j++)
  {
   if (a[i]<a[j])
   break;
  }
  if (j<i)
  {
   //将待排序元素取出
   temp=a[i];
   k=i;
   //将大于待排序元素的元素后移
   while (k>j)
   {
    a[k]=a[k-1];
    k--;
   }
   //将待排序元素插入到数组中
   a[k]=temp;
  }
 }
 for (i=0;i<n;i++)
 printf("%2d",a[i]);
 return 0;
}


插入排序动画演示:


软件学院ACM队,我们一直在努力



以上是关于经典排序算法 – 插入排序 Insertion sort的主要内容,如果未能解决你的问题,请参考以下文章

经典排序算法 – 插入排序 Insertion sort

Insertion 插入排序算法

常见经典排序算法

插入排序 Insertion-sort

插入排序算法(insertion-sort)

排序算法-插入排序(insertion sort)