InsertSort:(以升序为例)
插入排序的基本思想是:
每次将一个待排的记录,按照其关键字的大小,插入到前面已经排好序的有序区中适当的位置,直到全部记录插入完毕为止。
假设待排序的记录存放在数组R[0..n]中,初始时R[0]是一个有序区,R[1..n]是无序区,从i=1开始,依次将R[i]插入到有序区R[0..i-1]中,生成一个包含n个记录的有序区
void InsertSort(int *arr, int len)
{
int i = 0;
int j = 0;
int tmp = 0;
for (i = 1; i < len; i++)
{
tmp = arr[i];
for (j = i; j>0 && arr[j - 1]>tmp; j--) //在有序区找到一个正确的位置
{
arr[j] = arr[j - 1]; //将当前记录后移
}
arr[j] = tmp; //将tmp插入到找到的位置
}
}
优化:折半插入
既然有序区已经有序,那么我们在寻找合适位置的时候,可以使用折半查找的思想在有序区寻找这个位置。
稳定性
直接插入排序是稳定排序,即相同的数据元素在排序前后不会改变二者之间的相对顺序。
希尔排序
希尔排序又叫缩小增量排序,其实希尔排序就是插入排序的一种,只不过对插入排序做了优化。
在插入排序中