问题:

对待排序的数组r[1..n]中的元素进行直接插入排序,得到一个有序的(从小到大)的数组r[1..n]。

算法思想:

1、第一趟取增量d1(d1<n)把全部记录分为d1个组,所有间隔为d1的记录分在同一组,在各个组中进行直接插入排序。

2、第二趟取增量d2(d2<d1),重复上述的分组和排序。

3、以此类推,直到所取的增量dt=1(dt<dt_1<d_t-2<......<d2<d1),所有记录在同一组中进行直接插入排序为止。

图解:

代码:

#include<iostream>
using namespace std;
#define MAXSIZE 20//顺序表的最大长度
typedef int KeyType;//定义关键字类型为整型
typedef int InfoType;
typedef struct
{KeyType key;//关键字项InfoType otherinfo;//其他数据项
}RedType;
typedef struct
{RedType r[MAXSIZE+1];//r[0]闲置或做哨兵单元int length;//顺序表的长度
}SqList;//顺序表类型void ShellInsert(SqList &L,int dk)//对顺序表L做一趟增量是dk的希尔插入排序
{for(int i=dk+1;i<=L.length;i++)if(L.r[i].key<L.r[i-dk].key)//需将L.r[i]插入有序增量子表{int j;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];//将r[0]即原r[i],插入到正确的位置}//if
}void ShellSort(SqList &L,int dt[],int t)//按增量序列dt[0,t-1]对顺序表L做t趟希尔排序
{for(int k=0;k<t;k++)ShellInsert(L,dt[k]);
}int main()
{SqList L;int dt[3]={5,3,1};for(int i=1;i<=10;i++)L.r[i].key=11-i;L.length=10;for(int i=1;i<=L.length;i++)cout<<L.r[i].key<<" ";cout<<endl;ShellSort(L,dt,3);for(int i=1;i<=L.length;i++)cout<<L.r[i].key<<" ";cout<<endl;return 0;
}

运行结果:

数据结构之希尔排序图文详解及代码(C++实现)相关推荐

  1. 数据结构之堆栈排序图文详解及代码(C++实现)

    代码: #include<iostream> using namespace std; #define MAXSIZE 20//顺序表的最大长度 typedef int KeyType;/ ...

  2. 希尔排序(详解与代码)

    希尔排序算是对简单插入排序的一种改进,属于一种增量式的排序算法. 还不明白希尔排序概念的,先看这个希尔排序介绍 直接放代码 package com.lingaolu;/*** @author 林高禄* ...

  3. 数据结构与算法之选择排序图文详解及代码 (C++实现)

    实现: #include<iostream> using namespace std; #define MAXSIZE 20//顺序表的最大长度 typedef int KeyType;/ ...

  4. 数据结构之折半插入排序图文详解及代码(C++实现)

    问题: 对待排序的数组r[1..n]中的元素进行直接插入排序,得到一个有序的(从小到大)的数组r[1..n]. 算法思想: 1.设待排序的记录存放在数组r[1..n]中,r[1]是一个有序序列. 2. ...

  5. 数据结构之直接插入排序图文详解及代码(C++实现)

    问题: 对待排序的数组r[1..n]中的元素进行直接插入排序,得到一个有序的(从小到大)的数组r[1..n]. 算法思想: 1.设待排序的记录存放在数组r[1..n]中,r[1]是一个有序序列. 2. ...

  6. 十大经典排序算法-希尔排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  7. 算法 经典的八大排序算法详解和代码实现

    算法 经典的八大排序算法详解和代码实现 排序算法的介绍 排序的分类 算法的时间复杂度 时间频度 示例 图表理解时间复杂度的特点 时间复杂度 常见的时间复杂度 空间复杂度 排序算法的时间复杂度 冒泡排序 ...

  8. android代码查找快捷键是什么,Android Studio搜索功能(查找功能)及快捷键图文详解(示例代码)...

    1.在当前窗口查找文本[Ctrl+F] F3 向下查找关键字出现位置 Shift+F3 向上一个关键字出现位置 2.在当前工程内查找文本[Ctrl+Shift+F] 先会弹出一个对话框,直接点击[fi ...

  9. c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列图文详解

    前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法-栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去).而队列就好比是一个隧道,后面 ...

最新文章

  1. AdminIII连接linux Postgresql过程中的几个小问题
  2. Macbook pro 2016/2017 接入扩展坞时断 WIFI 问题的解决办法
  3. Head First C 第八章 静态库与动态库 创建动态库
  4. 用gdb调试core文件
  5. ajax和jsonp
  6. discuzx3.2发帖流程
  7. PHP从零开始--基础篇
  8. linux c之#include <unistd.h> 总结
  9. vb还是python强大-VB已死,Python当立 | 忆云竹
  10. Java17,有史以来最快 JDK!
  11. centos挂载ntfs文件系统
  12. python如何运用ols_python - 如何在python中使用OLSResults.f_test与实验组进行测试 - SO中文参考 - www.soinside.com...
  13. 软件测试典型缺陷分析,软件测试缺陷分析方法简介
  14. 7本软书,助你打破职场天花板
  15. Ubuntu16.04下网易云音乐点击图标打不开——已解决
  16. 下载论文,电子书籍(中英文),专利,数据库和课件
  17. 第三方支付接口申请条件和流程
  18. 图像分类经典卷积神经网络—SENet论文翻译(中英文对照版)—Squeeze-and-Excitation Networks(挤压和激励网络)
  19. 麦马计算机科学和麦马数学专业,积极配合 成功申请麦克马斯特大学数学专业...
  20. STM32 的 “位带”操作Bit-banding--学习笔记

热门文章

  1. java结丹期(15)----javaweb(maven(1))
  2. IDA pro 使用笔记
  3. 数据结构--环形链表
  4. GPTEE中的Crypto API的使用
  5. [羊城杯 2020]Power
  6. html数字变换插件,轻量级jquery数字动画插件
  7. Win32 Edit 文本框追加字符串
  8. JAVA_IO流四大家族(2)
  9. 设计模式C++实现(1)——工厂模式
  10. 2、数据库需求分析阶段详解