1.什么是插入排序
插入排序就是从一个乱序的待排序列中一次拿一个元素,从拿到的第二个元素开始,和现已拿出的元素从后往前(或从前往后)比较,指定比前面(后面)元素大(小),就找到了他的位置,在相应的位置放入拿出的这个元素。依次类推。
2.插入排序的关键点
插入排序可以不需要额外的空间就可以完成,因为当从待排序列中拿出一个元素时,它所在的位置就空了出来,用这个空位就可以用来挪位。举个例子,有待排序列如9 2 1 8,需求是按递增顺序排序。开始第一个元素不用动,从第二个元素开始,把2拿出来,2的位置空闲了,和9进行比较发现比9小,那么就把9交换到空位上,9的位置就空了出来,再就把2放在9的位置,序列现在是这样的:2 9 1 8。现在要拿的元素是1了,从它前一个位置依次往后比较,先和9比较发现比9小,9放到1的位置。再用1和2比较,发现还是比2小,就把2放到现在空出的先前放9的那个位置上,再往前没有元素了,那么这个位置就是1 的位置,序列现在是这样的:1 2 9 8。从刚才的分析中可以看出,插入排序是一个逐渐有序的过程,也就是说直到拿出最后一个元素后才可以完成排序,不存在到中间某个位置就已经有序了排序结束的情况。
3.插入排序应用
typedef int ElmentType;
void InsertionSort(ElmentType *S, int N)
{
int i,j;
for(i = 1; i<N;i++)
{
ElmentType tmp = S[i];
for(j = i;j >0 && tmp < S[j-1]; j--)
S[j] = S[j-1];
S[j] = tmp;
}
}