插入排序是最简单的一类排序方法,也是笔者在学习《算法笔记》的过程中,第一个感觉需要细心研究的排序方法
相比于选择排序和冒泡排序来讲,选择排序对数组操作的要求上升了一个等级,个人认为对入门算法有很好的启蒙作用。
原理阐释:
我们先避开概念不谈,直接来看一个实例:
这里有一个顺序混乱的整型数组 { 5 , 2 , 4 , 6 , 3 , 1 } \{5,2,4,6,3,1\} {5,2,4,6,3,1} 我们将按照插入排序的方法对其进行排序
我们假设前面的单个数字 5 是有序的后面的数字皆为无序,那我们所做的工作即为把仍无序的数字依次提出并插入到已经
有序的序列中,并将无序的部分后移,让出有序部分的空间。
(希望读者在阅读下面这段过程时不要抱怨繁琐而跳过,我们只有充分理解过程,才能将其转化为代码)
第一步:这时 5 已经有序,我们将 5 后移堵盖 2 ,并把 2 插入到最前面。
第二步:这时 2 5 已经有序,我们将 5 后移覆盖 4 ,并把 4 插入到 2 后面。
第三步:这时 2 4 5 已经有序,6 不动。
第四步:这时 2 4 5 6 已经有序,我们将 4 5 6 后移覆盖 3 ,并把 3 插入到 2 后面。
第五步:这时 2 3 4 5 6 已经有序,我们把 2 3 4 5 6 后移覆盖 1 ,并把 1 插入最前面。
这时,我们一共进行了五步,就将无序数组的排序完成了,细心的读者可以发现上面这段描述中,我把“后移” 放
到了“插入”之前,并且插入时,我只选择插入到某数之后或最前面,这与我们接下来所要进行的代码实现有关。
代码实现:
通过上面的例子,读者应该对选择排序有了基本的了解,那么我们从代码入手
int A[maxn], n;//排序范围为数组下标(0~n)
void InsertSort()
{
for (int i = 1; i <= n; i++)
{
int temp = A[i], j = i;//先将需要插入的数储存到temp中
while (j > 0 && temp < A[j - 1])
{
A[j] = A[j - 1];//后移过程
j--;
}
A[j] = temp;//跳出循环后最终插入
}
}