shell排序是插入排序的一种,在时间效率上有较大的改进。是一种不稳定的排序方法。
基本思想:选定第一个增量d1 < n,把全部记录按此值从第一个记录起进行分组,所有相距为d1的记录作为一组,先在各组内进行插入排序,然后减小间隙,取第二个增量d2 < d1,重复上述分组和排序过程,直到增量d为1为止,即所有的距离放在同一组内排序。
算法的思路:
shell排序算法通过三重循环实现;
1.外循环以各种不同的间隔距离d进行循环,直到d=1为止。
2.第二重循环是在某一个d值下对所分的组进行组循环
3.第三重循环是对第二重循环中所分的每个组,进行组内循环。
算法实现:
#include<stdio.h>
#define Type int //可以换为char
void shell_insert(Type *buf, int n)
{
Type x;
int i,j,d;
d = n / 2; //定义增量
while(d >= 1) //第一趟循环,以不同的d进行循环
{
for(i = d; i < n; i++) //第二趟循环,循环不同的组,应用直接插入排序
{
x = buf[i];
j = i - d;
while((j > 0)&&(x < buf[j])) //第三趟循环,组内排序,
{
buf[j + d] = buf[j];
j = j -d;
}
buf[j+d] = x;
}
d = d / 2; //再次划分增量d
}
}
int main()
{
int i;
Type num[11] = {1,11,23,32,24,3,5,8,10,16,22}; //"asdfghjkloq"
printf("Original array:");
for(i = 0; i < 11; i++)
printf("%d ", num[i]); //注意输出格式的替换
printf("\n");
shell_insert(num, 11);
printf("Sorted array:");
for(i = 0; i < 11; i++)
printf("%d ", num[i]); //注意输出格式的替换
printf("\n");
return 0;
}