插入排序的基本思想:每一步将一个待排序元素按其关键字值得大小插入到已排序的序列的适当位置上,直到待排序元素插入完为止。
插入排序的思想很简单,但是却有几个小地方容易被忽略,从而在“阴沟里翻船”。
先上个教材里的直接插入排序的程序:
void InsertionSort(int *a,int n)
{
//直接插入排序算法,结果为升序
//参数说明:a为数组名;
// n为数组大小.
int i;
for(i=1;i<n;i++)
{
int temp=a[i];
int j=i;
while(j>0&&temp<a[j-1])
{
a[j]=a[j-1];
j--;
}
a[j]=temp;
}
}
可是吧,我一直习惯用for循环,于是我自己的程序如下:
void InsertionSort(int *a,int n)
{
//直接插入排序算法,结果为升序
//参数说明:a为数组名;
// n为数组大小.
int i;
for(i=1;i<n;i++)
{
int temp=a[i];
int j=i;
for(;j>=0;j--)
if(a[j-1]>temp)
a[j]=a[j-1];
else
break; //(1)
a[j]=temp; //(2)
}
}
刚开始的时候,没写(1)语句,测试结果都不对。经过认真检查之后,才意识到这个问题。
再有,语句(2)也是一个容易出错的点。