直接插入排序
从a[1]开始循环,每一个趟循环左面已排好序,将这一趟的数插入到前面的序列,形成新的排好序的序列。
void insertSort(int *a,int len)
{
int flag;//哨兵
int i,j;
for(i=1;i<len;i++)
{
if(a[i]<a[i-1])
{
flag = a[i];
j=i-1;
while(j>=0&&flag<a[j])
{
a[j+1]=a[j];
j--;
}
a[j+1]=flag;//归位
}
}
}
希尔排序
与直接插入排序类似,上面的d为1,这里d任意。第一个函数把直接插入的1改成d,第二个函数给出d的值,d等于1时结束。
void shellInsertSort(int *a,int len,int d)
{
int flag;
int i,j;
for(i=d;i<len;i++)//从d开始,与前面比较
{
if(a[i]<a[i-d])
{
flag = a[i];
j=i-d;
while(j>=0&&flag<a[j])
{
a[j+d]=a[j];
j-=d;
}
a[j+d]=flag;
}
}
}
void shell(int a[],int len,int d)
{
for(;d>=1;d/=2)
{
shellInsertSort(a,len,d);
}
}
主函数
int main()
{
int a[10] = {3,5,2,8,1,4,6,3,1,9};
//insertSort(a,10);
shell(a,10,5);
int i;
for(i=0;i<10;i++)
{
printf("%-5d",a[i]);
}
return 0;
}