希尔排序(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
- 希尔排序(ShellSort)
- 希尔排序 (ShellSort)
- 希尔排序(Shellsort)
- 希尔排序(ShellSort)
- 希尔排序(shellsort)
- 希尔排序(ShellSort)
- 希尔排序(ShellSort)
- 希尔排序(shellSort)
- 希尔排序(shellsort)
- 希尔排序(ShellSort)
- ShellSort(希尔排序)
- 希尔排序(Shellsort)简介
- 排序算法之希尔排序(Shellsort)
- Java排序算法--希尔排序(Shellsort)
- 排序算法之希尔排序(ShellSort)
- 排序- 希尔排序 ShellSort
- 希尔排序(ShellSort程序完整版)
- 03_希尔排序(ShellSort)
- LintCode 比较字符串
- cocos2d-x 3.x相应键盘事件
- 欢迎使用CSDN-markdown编辑器
- javaday11-开发工具Eclipse使用
- python发送http multipart报文并和php交互
- 希尔排序(ShellSort)
- ui-router中resolve使用说明
- 怎么把字符串的时间转换为想要的时间格式
- 内存分析工具 MAT 的使用
- iOS开发之多线程NSOperation
- 大猫品Android[一][打入MessageQueue内部]
- 读取xml文件中的数据示例
- iOS框架介绍——Q&R&S字头
- 在IM中拿来就用的录音Demo