shell排序是通过分组来进行排序,让后一个分组的数字和前面一个分组的数字进行对比,如果大于(或者小于),那么进行替换。排好之后再进行下一轮排序。
shell排序的代码如下:
/*************************************************************************
> File Name: test.c
> Author: wayne
> Mail: @163.com
> Created Time: 2015/7/6 21:09:57
************************************************************************/
#include<stdio.h>
void array(int a[], int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ", a[i]);
}
}
void shellsort(int a[], int len)
{
int i, j, increment;
int tmp;
for(increment = len/2; increment > 0 ; increment /=2)
{
for(i=increment;i<len;i++)
{
tmp = a[i];
for(j=i; j>=increment; j-=increment)
{
if(tmp<a[j-increment])
a[j] = a[j-increment];
else
break;
}
a[j] = tmp;
}
array(a, 13);
printf("---------\n");
}
}
int main()
{
int a[] = {81,94,11,96,12,35,17,95,28,58,41,75,15};
int len = sizeof(a)/sizeof(int);
printf("%d\n", len);
printf("\n");
array(a, len);
printf("\n");
shellsort(a, len);
array(a,len);
return 0;
}
运行的结果如下:
13 81 94 11 96 12 35 17 95 28 58 41 75 15 15 94 11 58 12 35 17 95 28 96 41 75 81 --------- 15 12 11 17 41 28 58 94 35 81 95 75 96 --------- 11 12 15 17 28 35 41 58 75 81 94 95 96 --------- 11 12 15 17 28 35 41 58 75 81 94 95 96
数字被6分成3个分组, 首先是81,17 15进行比较排序,可以看到第三行 是按照 15 , 17 ,81排好
由于第三个分组只有一个元素,所以是 94 , 95排序,位置不变,然后是11,28排序,位置不变,然后是96,58排序,96和58位置互换。然后是12和41对比,位置不变。最后是35和75对比,位置不变。
所以第一轮排序出来的结果是第三行