经典排序算法 – 插入排序 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应该插在2与6之间,所以将6向后移一位(为元素4空出位置),再将4移至标记位置(2与6之间)
交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |
第三次,将2 4 6两个元素看成是已经完成排序的数组,将1看成的待插入的元素,因为6>1,4>1,2>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>5,4<5,所以5应该插在4和6之间,所以将6向后移一位(为元素5空出位置),再将5移至标记位置(4和6之间)
交换前状态| 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的主要内容,如果未能解决你的问题,请参考以下文章