Shell基本思想:
将整个序列分成m个子序列,对每个子序列分别排序。逐步减少子序列列数m,直至m=1为止。
n=10;
通常我们第一次取的增量 d=n/2,对比之后将小的数放到前面,当然你可以将大的放到前面
9 2 8 4 6 1 -1 0 93 24
第一趟:9-->1 , 2-->-1, 8-->0 , 4-->93 , 6-->24,
结果:1 -1 0 4 6 9 2 8 93 24
第二趟:d=d/2=2;
1-->0 , 0-->6, 6-->2, 2-->93
-1-->4, 4-->9, 9-->8, 8-->24
结果:自己想
第三趟:自己动动手呗。
环境:winxp,vc++6.0
//最好自己写一遍吧,能不看就不看
//还有,这边说这个shell排序是插入排序的改进版,但是我在这个实现中,似乎没有很好的体现插入排序
#include<stdio.h>
void shellinsert( int *p, int n, int d)
{
int i;
int j;
int k;
int temp;
for(i=0;i<d;i++)
{
k=i;
for(j=i+d;j<n;j=j+d)
{
if(p[k]>p[j])
{
temp=p[k];
p[k]=p[j];
p[j]=temp;
}
k=j;//这个别写错位置了,我就是写错位置,搞了一个多小时
}
}
}
void shellsort(int *p, int n )
{
int d=n/2;
while(d>0)
{
shellinsert(p, n, d);
d=d/2;
}
}
int main()
{
int n=10;
int i=0;
int p[10]={9,2,8,4,6,1,-1,0,93,24};
for( i=0;i<n;i++)
printf("%d ",p[i]);
printf("\n");
shellsort(p,n);
for( i=0;i<n;i++)
printf("%d ",p[i]);
printf("\n");
return 0;
}