希尔排序是一种插入排序算法,Shell排序又称作缩小增量排序。Shell排序的执行时间依赖于增量序列。
希尔排序的基本思想:先取一个小于n的整数d作为第一个增量,把文件的全部记录分成 d个组。所有距离为d的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2 < d重复上述的分组和排序,直至所取的增量 dk = 1 (dk < dk-l < …< d2 < d),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
#define D 5
typedef char InfoType;
typedef struct Sz
{
int key;
InfoType *info;
}Sz;
typedef struct SQ//定义一个顺序线性表
{
Sz *R;
int length;
}SqList;
int Init_SqList(SqList *L)//顺序线性表初始化
{
L->R=(Sz *)malloc((MAX_SIZE + 1) * sizeof(Sz));
if(!L->R)
return 0;
else
{
L->length = 0;
return 1;
}
}
进行一趟希尔排序
/* 对顺序表L进行一趟希尔排序, 增量为d */
void shell_pass(SqList *L, int d)
{
int j;
int k;
for(j = 1; j <= L->length; j++)
{
L->R[0] = L->R[j]; /* 设置监视哨兵 */
k = j + d;
while((k > 0) && (L->R[0].key > L->R[k].key))
{
L->R[j] = L->R[k];
L->R[k] = L->R[0];
}
}
}
一直循环到增量d为1为止
/*按增量序列dk[0 … t-1],对顺序表L进行希尔排序*/
void shell_sort(SqList *L, int dk[], int t)
{ //dk是增量数组,t是dk的长度
int m;
for(m = 0; m <= t; m++)
shell_pass(L, dk[m]);//一直循环到增量d为1为止
}
main方法
int main()
{
int i;
int num;
int dk[D];
SqList L;
Init_SqList(&L);
for(i = D; i > 0; i--)//初始化增量数组
{
dk[D - i] = i;
}
/*输入排序码*/
printf("please enter the number of the data:");
scanf("%d", &num);
for(i = 1; i < num + 1; i++){
int values;
printf("please enter the data:");
scanf("%d", &values);
L.R[i].key = values;
L.length++;
}
for(i = 1; i <= L.length; i++)
{
printf("%d ", L.R[i].key);
}
printf("\n");
printf("-----------------------------\n");
/*希尔排序*/
shell_sort(&L, dk, D);
for(i = 1; i <= L.length; i++)
{
printf("%d ", L.R[i].key);
}
printf("\n");
return 0;
}
例:
运行结果: