#include <stdio.h>
#include <stdlib.h>
//严格按照算法写 1A 1B 1C 排好后 排2A 2B 2C
void ShellSort1(int a[],int len)
{
int i,j,gap,temp,k;
for(gap=len/2;gap>0;gap/=2)
{
for(i=0;i<gap;i++)
for(j=i+gap;j<len;j+=gap)
{
if(a[j]<a[j-gap])
{
temp=a[j];
k=j-gap;
while(k>=0&&a[k]>temp)
{
a[k+gap]=a[k];
k-=gap;
}
a[k+gap]=temp;
}
}
}
}
// 2B 2B 2C 排好后 排3A 3B 3C
void ShellSort2(int a[],int len)
{
int j,gap,temp,k;
for(gap=len/2;gap>0;gap/=2)
{
for(j=gap;j<len;j++)
{
if(a[j]<a[j-gap])
{
temp=a[j];
k=j-gap;
while(k>=0&&a[k]>temp)
{
a[k+gap]=a[k];
k-=gap;
}
a[k+gap]=temp;
}
}
}
}
//边比较边交换
void ShellSort3(int a[],int len)
{
int i,j,gap,temp,k;
for(gap=len/2;gap>0;gap/=2)
{
for(j=gap;j<len;j++)
for(i=j-gap; i>=0 && a[i+gap]<a[i];i-=gap)
{
temp=a[i+gap];
a[i+gap]=a[i];
a[i]=temp;
}
}
}
int main(int argc, char *argv[])
{
int i;
int a[]={4,5,2,6,9,7,5,74,56,89,132};
int b[]={4,5,2,6,9,7,5,74,56,89,132};
int c[]={4,5,2,6,9,7,5,74,56,89,132};
ShellSort1(a,11);
for(i=0;i<11;i++)
printf("%d ",a[i]);
printf("\n");
ShellSort2(b,11);
for(i=0;i<11;i++)
printf("%d ",b[i]);
printf("\n");
ShellSort3(c,11);
for(i=0;i<11;i++)
printf("%d ",c[i]);
printf("\n");
system("PAUSE");
return 0;
}
希尔排序 缩小增量排序
最新推荐文章于 2021-05-22 20:46:51 发布