数据结构之希尔排序:
算法思想:
每隔dk个元素取出待排序表中的元素,构成一组,分别进行直接插入排序,随着增量dk的不断减小,待排序表将基本有序。当dk=1时,即最后一次为直接插入排序。整个有序表将是有序的。
代码:
#include<stdio.h>
#define ElemType int
#define maxsize 21
typedef struct
{
ElemType data[maxsize];
int length;
}sqlist;
void printElem(sqlist* l)
{
int i=1;
for(i=1;i<l->length;i++)
printf("%d ",l->data[i]);
printf("\n");
}
void ShellSort(sqlist* l)
{
int i=0;
int dk=0;
int j=0;
int s=1;
for(dk=l->length/2;dk>=1;dk=dk/2) //希尔排序的步长变化
{
for(i=dk+1;i<l->length;++i)
{
if(l->data[i]<l->data[i-dk]){
l->data[0]=l->data[i]; //这里为什么不需要哨兵? 因为j下面的循环条件是j>0
for(j=i-dk;(j>0)&&(l->data[0]<l->data[j]);j=j-dk)
l->data[j+dk]=l->data[j];
l->data[j+dk]=l->data[0];
}//if
}//for
printf("希尔排序第%d次排序,步长是%d。\n",s++,dk);
printElem(l);
}//for
}
int main()
{
sqlist ll;
int i=1;
ll.data[0]=0;
ll.length=1;
for(i=1;i<maxsize;i++)
{
ll.data[i]=rand()%100;
ll.length++;
}
// printf("%d",ll.length);
printf("未排序前的顺序为:\n");
printElem(&ll);
ShellSort(&ll);
}
运行结果: