插入排序:每一趟将一个待排序的元素,按其关键字的大小插入到已排序序列的适当位置,直到全部插入完成。
常见的插入排序有以下三种。
1、直接插入排序
1)过程:直接插入排序是一种最简单的排序方法,其过程就是依次将每个元素插入到一个有序的序列中去。不过它有个缺点,就是当我们的数据基本有序时,每次插入都要移动位置,此时的插入效率是很低的。为了解决这种情况,又产生了拆半插入排序,希尔排序。
工作原理:插入排序在实现上,从后面向前扫描(一开始从下标为1的元素开始,往下标为0的元素遍历),在扫描过程中,需要反复把已排序元素逐步向后挪位,为最新的元素提供插入位置。
。
void InsertionSort(int *a, int len)
{
for (int j=1; j<len; j++)
{
int key = a[j];
int i = j-1;
while (i>=0 && a[i]>key)
{
a[i+1] = a[i];
i--;
}
a[i+1] = key;
}
}
2、希尔排序
1)过程:希尔排序又称缩小增量排序,基本思想:把元素按下标的一定增量d分组,对每组元素采用直接插入排序的方法进行排序,然后随着增量不断减小,直到d为1,整个数据合为一组有序序列。
自己理解:按一定增量为一组,此时49、13一组,38、27一组,65、49一组,对他们做插入排序,直到增量变为1