希尔排序(ShellSort)

来源:互联网 发布:debian nginx一键脚本 编辑:程序博客网 时间:2024/06/16 15:07

 

//希尔排序#include<stdio.h>#define MAX_SIZE 20#define N 10#define T 3struct RedType // 记录的类型{int key;int others;};struct SqList //顺序表的类型{RedType r[MAX_SIZE+1]; //r[0]闲置或者用作哨兵单元int length;//顺序表的长度};
<span style="color:#ff0000;">//注意下面的这个函数只是进行一趟希尔排序</span><span style="color:#ff0000;">//对顺序表L作一趟希尔插入排序,本算法和直接插入排序做了以下的修改://前后记录位置的增量不是1而是dk//r[0]只是暂存单元,不是哨兵</span>void ShellInsert(SqList &L,int dk){int i,j;for(i=1+dk;i<=L.length;i++) //注意这里是i++不是i+=dk,因为从开始的每一个元素都要向后查找dk{if(L.r[i].key < L.r[i-dk].key) //需要将r[i]插入有序增量子表{L.r[0] = L.r[i];//暂时存放在L.r[0]//记录后移,查找插入的位置for(j=i-dk;j>0 && L.r[0].key < L.r[j].key;j-=dk){L.r[j+dk]=L.r[j];}L.r[j+dk]=L.r[0];//插入}}}//打印每一趟的排序的结果void print(SqList L){int i;for(i=1;i<=L.length;i++){printf("%d ",L.r[i].key);}printf("\n");}//打印最后的排序的结果void print1(SqList L){int i;for(i=1;i<=L.length;i++){printf("(%d,%d) ",L.r[i].key,L.r[i].others);}printf("\n");}
<span style="color:#ff0000;">//注意下面的这个函数是按照增量序列进行总的希尔排序</span><span style="color:#ff0000;">//按照增量序列dlta[0..t-1]对顺序表L作希尔排序</span>void ShellSort(SqList &L,int dlta[],int t){int k;for(k=0;k<t;k++){ShellInsert(L,dlta[k]);//一趟增量为dlta[k]的插入排序printf("第%d趟排序的结果:",k+1);print(L);}}void main(){int i,j;RedType r[N]={{49,1},{38,2},{65,3},{97,4},{76,5},{13,6},{27,7},{49,8},{55,9},{4,10}};SqList l;<span style="color:#ff0000;">int dt[T]={5,3,1};//增量序列数组,,注意增量序列的最后一个增量为1</span>l.length=N;for(i=0;i<=l.length;i++){l.r[i+1]=r[i];}printf("排序前:");print(l);ShellSort(l,dt,T);printf("排序后:\n");print1(l);}


(1)希尔排序的排序过程原理图如下:

这个排序的增量序列为dt[3]={5,3,1}; 注意最后的一个增量要为1。你要对照着这个过程图自己走几遍,是不是很清晰明了?是不是恍然大悟?

(2)程序的运行结果如下:

 

0 0
原创粉丝点击