插入排序的基本思想:每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子表中的适当位置,直到全部记录插入完成为止。
1.直接插入排序
直接插入排序的主要操作是将当前无序区的第1个记录插入到有序区的适当位置上,从而生成新的有序区。
void Insert_Sort(int a[],int size)
{
int i,j,temp;
for (i=1;i<size;i++)
{
temp = a[i];
for (j=i-1;j>=0 && temp<a[j];j--)
{
a[j+1] = a[j]; //将关键字大于a[i]的记录后移
}
a[j+1]=temp; //将j+1处插入a[i];
}
}
直接插入排序是一个稳定的排序算法,该算法的平均时间复杂度为O(n^2).
2.希尔排序
希尔排序算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d,对每组中全部元素进行排序,然后用一个较小的增量对它进行再次分组,并对每个新组重新进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。因此,希尔排序实质上时一种分组插入方法。
void ShellSort(int a[],int size)
{
int i,j,gep;
int temp;
gep = size/2; //增量置初值
while (gep>0)
{
for (i=gep;i<size;i++)
{
temp = a[i];
j = i-gep;
while(j>=0 && temp<a[j]) //对相隔gep位置的元素组进行排序
{
a[j+gep] = a[j];
j = j-gep;
}
a[j+gep] = temp;
}
gep = gep/2; //减小增量
}
}
希尔排序是一个不稳定的排序算法,该算法的平均时间复杂度为O(n^1.3).