希尔排序
希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。希尔排序是非稳定排序算法
直接插入排序:对于数据量较小,数据序列基本有序的情况下算法复杂度较低
希尔排序基本思想:通过将序列划分若干组小数据量的序列(设置增量序列),别且对各组序列分别进行直接插入排序。
因此:希尔排序等价于将原有数据量大的直接插入拆分成数次小的直接插入,形成基本有序的序列,通过最后增量为1的直接插入整合效果。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 30
typedef struct{
int r[MAXSIZE];
int length;
}SqList;
//增量为dk时的一趟排序具体过程
void ShellInsert(SqList *L,int dk){
int i=0,j=0,k=0;
for(i=0;i<dk;i++){ //根据增量大小,数组可以拆分为dk组数据,每组数据以第i个打头
for(j=i;j<L->length;j=j+dk){
int temp=L->r[j]; //存放临时记录Key值
for(k=j-dk;k>=0&&temp<L->r[k];k=k-dk)
L->r[k+dk]=L->r[k];//后移记录,找到插入位置
L->r[k+dk]=temp; //赋值插入
}
}
return;
}
//根据增量序列增量个数对数组进行t趟排序,最后一趟增量必为1
void ShellSort(SqList *L,int dlta[],int t){
for(int k=0;k<t;k++){
ShellInsert(L,dlta[k]); //
}
return;
}
int main()
{
int t=4;
int dlta[4]={5,3,2,1};//设置增量序列
SqList L;
L.length=12;
for(int i=0;i<12;i++)
scanf("%d",&L.r[i]);//输入待排序数组
printf("Befor Sort:\n");
for(int i=0;i<12;i++)
printf("%d\t",L.r[i]);
ShellSort(&L,dlta,t);//希尔排序
printf("\nAfter Sort:\n");
for(int i=0;i<12;i++)
printf("%d\t",L.r[i]);
return 0;
}
结果显示: