插入排序是一种较为经典的排序算法,它的思想是将一个数插入到一组有序数列中,使得插入后的数列仍为有序数列。依据这一算法思想可以得出:在改数插入前和插入后,所在数列均为有序数组,所变化的只是数列的长度。
所以就产生了一个循环不变式:有序数列,插入新数,仍为有序数列,再插入……
算法导论上列举了如下伪代码
INSERTION-SORT(A)
for j = 2 to A.length
key = A[j]
//Insert A[j] into the sorted sequence A[1..j - 1].
i = j-1
while i>0 and A[i] > key
A[i+1] = A[i]
i = i-1
A[i+1] = key
内层循环while循环的作用是保持数列有序,而外层循环的作用是将新数逐个加入到有序数列中,由此完成算法。
代码片段如下
void insertSort(int *insertSortArray,int length)
{
for(int flag=1;flag<length;flag++){
int key = insertSortArray[flag];
int iteratorFlag = flag-1;
while(iteratorFlag >= 0 && insertSortArray[iteratorFlag] > key){
insertSortArray[iteratorFlag+1] = insertSortArarry[iteratorFlag];
iteratorFlag--;
}
insertSortArray[iteratorFlag+1] = key;
}
}