数据结构之希尔排序图文详解及代码(C++实现)
问题:
对待排序的数组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++实现)相关推荐
- 数据结构之堆栈排序图文详解及代码(C++实现)
代码: #include<iostream> using namespace std; #define MAXSIZE 20//顺序表的最大长度 typedef int KeyType;/ ...
- 希尔排序(详解与代码)
希尔排序算是对简单插入排序的一种改进,属于一种增量式的排序算法. 还不明白希尔排序概念的,先看这个希尔排序介绍 直接放代码 package com.lingaolu;/*** @author 林高禄* ...
- 数据结构与算法之选择排序图文详解及代码 (C++实现)
实现: #include<iostream> using namespace std; #define MAXSIZE 20//顺序表的最大长度 typedef int KeyType;/ ...
- 数据结构之折半插入排序图文详解及代码(C++实现)
问题: 对待排序的数组r[1..n]中的元素进行直接插入排序,得到一个有序的(从小到大)的数组r[1..n]. 算法思想: 1.设待排序的记录存放在数组r[1..n]中,r[1]是一个有序序列. 2. ...
- 数据结构之直接插入排序图文详解及代码(C++实现)
问题: 对待排序的数组r[1..n]中的元素进行直接插入排序,得到一个有序的(从小到大)的数组r[1..n]. 算法思想: 1.设待排序的记录存放在数组r[1..n]中,r[1]是一个有序序列. 2. ...
- 十大经典排序算法-希尔排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 算法 经典的八大排序算法详解和代码实现
算法 经典的八大排序算法详解和代码实现 排序算法的介绍 排序的分类 算法的时间复杂度 时间频度 示例 图表理解时间复杂度的特点 时间复杂度 常见的时间复杂度 空间复杂度 排序算法的时间复杂度 冒泡排序 ...
- android代码查找快捷键是什么,Android Studio搜索功能(查找功能)及快捷键图文详解(示例代码)...
1.在当前窗口查找文本[Ctrl+F] F3 向下查找关键字出现位置 Shift+F3 向上一个关键字出现位置 2.在当前工程内查找文本[Ctrl+Shift+F] 先会弹出一个对话框,直接点击[fi ...
- c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列图文详解
前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法-栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去).而队列就好比是一个隧道,后面 ...
最新文章
- AdminIII连接linux Postgresql过程中的几个小问题
- Macbook pro 2016/2017 接入扩展坞时断 WIFI 问题的解决办法
- Head First C 第八章 静态库与动态库 创建动态库
- 用gdb调试core文件
- ajax和jsonp
- discuzx3.2发帖流程
- PHP从零开始--基础篇
- linux c之#include <unistd.h> 总结
- vb还是python强大-VB已死,Python当立 | 忆云竹
- Java17,有史以来最快 JDK!
- centos挂载ntfs文件系统
- python如何运用ols_python - 如何在python中使用OLSResults.f_test与实验组进行测试 - SO中文参考 - www.soinside.com...
- 软件测试典型缺陷分析,软件测试缺陷分析方法简介
- 7本软书,助你打破职场天花板
- Ubuntu16.04下网易云音乐点击图标打不开——已解决
- 下载论文,电子书籍(中英文),专利,数据库和课件
- 第三方支付接口申请条件和流程
- 图像分类经典卷积神经网络—SENet论文翻译(中英文对照版)—Squeeze-and-Excitation Networks(挤压和激励网络)
- 麦马计算机科学和麦马数学专业,积极配合 成功申请麦克马斯特大学数学专业...
- STM32 的 “位带”操作Bit-banding--学习笔记