插入排序分为直接排序和希尔排序两种:
//直接排序
void InsertSort(DataType a[ ],int n)
{
int i,j;
DataType temp;
for(i=0;i<n-1;i++)
{
temp=a[i+1];
j=i;
while(j!=-1 && temp.key<a[j].key)
{
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
}
插入排序分析:
该函数传入待排序的数组,还有数组元素的个数。
首先,第一层循环为n-1次,即共循环比较n-1次,因为最后一个剩下的元素已不需要比较。
进入第一次循环后,先是用temp把待排序元素的下一位记录下来,j把待排序元素的下标记录下来,
然后进入第二层循环while(j!=-1 && temp.key<a[j].key):如果temp的值比a[j]的值小,就把a[j]往后移,依次后移直到顺序排序,
因为除了j之外,其他元素都已作出变动,所以要把较小的temp的值重新赋给a[j]。此时的j因为多减了一次,所以需要j++。
//希尔排序
void ShellSort(DataType a[],int n,int d[],int numOfD)
{
DataType temp;
int i,j,k,span,m;
for(i=0;i<numOfD;i++) //共numOfD个希尔增量
{
span=d[m]; //取一个的希尔增量为span
for(k=0;i<span;k++) //每一个希尔增量代表的是把元素划分为span个组,每个小组里元素差值为span
{
for(j=k;j<n-span;j=j+span)
{
tenp=a[j+span];
m=j;
while(m!=-1 && temp.key<a[m].key)
{
a[m+span]=a[m];
m-span;
}
a[m+span]=temp;
}
}
}