伪算法
INSERTION-SORT(A)
1 for j = 2 to A.length
2 key = A[j]
3 //Insert A[j] into the sorted sequence A[1..j-1]
4 i = j - 1
5 while i > 0 and A[i] > key
6 A[i+1] = A[i]
7 i = i - 1
8 A[i+1] = key
图示表示算法工作原理
对数组A=<5,2,4,6,1,3>以上算法该如何工作?
下标j指出正被插入到已知序列的数字。在for循环(循环变量为j)的每次迭代的开始,包含元素A[1..j-1]的子数组构成了当前排序好的值,剩余的子数组[j+1..n]对应于仍然需要排序的数组。事实上,元素A[1..j-1]就是原来在位置1到j-1的元素,但是现在已经按序排列。我们把A[1..j-1]的这些性质形式地表示为一个循环不变式:
在第1~8行的for循环的每次迭代开始时,子数组A[1..j-1]由原来在A[1..j-1]中的元素组成,但已经按序排列。
循环不变式
关于循环不变式,我们需要证明三条性质
初始化:循环的第一次迭代之前,它为真。
保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真。
终止:在循环终止时,不变式为我们提供一个有用的性质,该性质有助于证明算法是正确的。
插入排序例子程序实现
伪算法分析
由于数组开始元素下表为0,所以C语言实现伪需要修改条件,j=1开始,while循环条件需要修改为i>=0 && A[i]>key
INSERTION-SORT(A)
1 for j = 1 to A.length
2 key = A[j]
3 //Insert A[j] into the sorted sequence A[1..j-1]
4 i = j - 1
5 while i >= 0 and A[i] > key
6 A[i+1] = A[i]
7 i = i - 1
8 A[i+1] = key
代码实现
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int A[] = {5,2,4,6,1,3};
int n = sizeof(A)/sizeof(A[0]);
int i = 0;
int j = 0;
int key = 0;
printf("The array Length=%d\n",n);
printf("Before sortting: ");
for(i=0;i<n;i++)
printf("%d ", A[i]);
printf("\n");
for(j=1;j<n;j++)
{
key = A[j];
i = j -1;
while(i>=0 && A[i] > key)
{
A[i+1] = A[i];
i = i - 1;
}
A[i+1] = key;
}
printf("After sortting : ");
for(i=0;i<n;i++)
printf("%d ", A[i]);
printf("\n");
return 0;
}
执行结果
root@ubuntu:/home/test# ./a.out
The array Length=6
Before sortting: 5 2 4 6 1 3
After sortting : 1 2 3 4 5 6