【八大数据排序法】希尔排序法的图形理解和案例实现 | C++

news2024/10/7 14:23:52

第十七章    希尔排序法


目录

第十七章    希尔排序法

●前言

●认识排序

●一、希尔排序法是什么?

1.简要介绍

2.图形理解

3.算法分析

●二、案例实现

1.案例一

●总结


前言

        排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增或递减的方式重新进行排序。在如今的互联网信息时代,随着大数据和人工智能的发展,大型企业的数据库中有亿级的用户数据量。因此对其进行处理,排序算法也就成为了其中必不可缺的步骤之一。


认识排序

        排序功能对计算机领域而言,是一项非常重要而且普遍的工作。排序中数据的移动方式可分为直接移动和逻辑移动两种方式,直接移动是直接交换存储数据的位置,而逻辑移动并不会移动数据存储的位置,仅改变指向这些数据辅助指针的值。排序通常按照数据量的多少和所使用的内存,可分为内部排序和外部排序,数据量小可以全部加载到内存来进行排序的,就称为内部排序,大部分排序属于此类。数据量大而无法一次性加载到内存中,必须借助磁带,磁盘等辅助存储器进行排序的,则称为外部排序。随着数据结构科学的进步,如今,陆续被提出的冒泡排序法,选择排序法,插入排序法,合并排序法,快速排序法,堆积排序法,希尔排序法,基数排序法,直接合并排序法等等,它们各有其特色和其应用场合。并且在算法中,我们非常关注算法程序代码的时间复杂度和空间复杂度,因为它会直接体现出我们程序代码的执行效率以及编程人员的逻辑思维等等的综合能力。当数据量相当庞大时,排序算法所花费的时间就显得相当重要,排序算法的时间复杂度可分为最好情况、最坏情况以及平均情况。另外,对于任何的排序算法都会有数据交换的操作,数据互换位置会暂时用到一个额外的空间,这也是排序算法中空间复杂度要考虑到的问题,而在排序算法中所使用的额外空间越小,它的空间复杂度就越好。


一、希尔排序法是什么?

1.简要介绍

        希尔排序法是D.L.Shell在1959年发明的一种排序方法,它可以减少插入排序法中数据搬移的次数,从而去加速排序的进行。它的原则是将数据区分成特定间隔的几个小区快,以插入排序法排完区块内的数据后再渐渐减少间隔的距离。

2.图形理解

        用希尔排序法对下面的8个数据元素进行从小到大的排序,具体情况如下图所示:

         首先将所有数据分成Y份(8/2),即分成4份将其称为划分数。注意,划分数不一定是2,但是质数是最好的,所以为了方便计算,我们最终会将其化为2份。因此一开始的间隔划分为4,具体情况如下图所示:

         如此就可以得到4个区块,分别是(63,45)(92,71)(27,58)(36,7),再分别用插入排序法排序为(45,63)(71,92)(27,58)(7,36)。具体情况如下图所示:

         接着去缩小间隔为((8/2)/2),具体情况如下图所示:

        再分别用插入排序法对(45,27,63,58)(71,7,92,36)进行排序,排序结果为(27,45,58,63)(7,36,71,92)。具体情况如下图所示:

         再以(((8/2)/2)/2)的间隔去进行分区的插入排序,即对每一个元素进行排序。具体情况如下图所示:

     最终的情况下即用插入排序法对(27,7,45,36,58,71,63,92)这个八个数据元素进行

 排序,排序结果为(7,27,36,45,58,63,71,92)。具体情况如下图所示:

3.算法分析

         ①希尔排序法和插入排序法一样,都属于稳定排序法。

        ②希尔排序法只需要一个额外的空间,因此空间复杂度为最佳。

        ③希尔排序法适用于大部分数据都已经排好了的情况。

        ④该排序法在任何情况下的时间复杂度都为O(^{}n^{3/2})。

二、案例实现

1.案例一

①范例程序:用希尔排序法对7、66、2、40、30、67、90、11这八个数据元素进行排序,并且输出每次希尔分区后排序下的结果状态。

②代码展示:

#include<iostream>
using namespace std;
#define size 8 //事先声明排序数据的个数
class shell {
public:
	int data[size];
	void showresult(){
		for (int i = 0; i < size; i++)
			cout <<" " << data[i];
		cout << endl;
	}
	void shell_start() { 
		int k = 0;    //打印计数
		int jump = size / 2;   //分区的间距位移量
		while (jump != 0)
		{
			for (int i = jump; i < size; i++)    //每次分区后的扫描次数
			{
				int temp = data[i];    //展示存储数据
				int j = i - jump;    //定位比较元素
				while (temp<data[j]&&j>=0)     //插入排序法的基本算法,只不过下标参数有所改变
				{
					data[j + jump] = data[j];
					j-=jump;
				}
				data[jump+j] = temp;
			}
			cout << "第" << ++k << "次扫描:";
			showresult();
			jump /= 2;   //控制整体循环数,即分区的次数
		}
	}
};
void text()
{
	shell s;
	cout << "请输入要排序的" << size << "个数据" << endl;
	for (int i = 0; i < size; i++)
		cin >> s.data[i];
	cout << "排序前:" << endl;
	s.showresult();
	s.shell_start();
	cout << "排序后:" << endl;
	s.showresult();
}
int main()
{
	text();
}

③结果展示:


总结

        以上就是希尔排序法的讲解,从上面的图形以及代码中不难看出,希尔排序法是经过插入排序法进行修改而创新出的一种新的排序方法。该排序法的鲜明特征就体现在了它的分区块思想上,将一个大序列多次分成多个小的子序列进行比较排序,我认为这是一种很好的思想。我们学算法,重要的不是去学习记忆那些固定的算法的代码段,而是去体会不同算法的编程思想,从而将其合理的运用到我们的程序代码中。

                                               <您的三连和关注是我最大的动力>

                       🚀 文章作者:Keanu Zhang        分类专栏:算法之美(C++系列文章)

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++引用(特性+使用场景+常引用)

文章目录1. 概念2. 关于别名的理解3. 引用的特性1.引用必须在定义时初始化2.一个变量可以有多个别名3.引用一旦引用一个实体&#xff0c;再不能引用其他实体4.使用场景1. 引用做参数2. 引用做返回值1. 传值返回是否为n直接返回临时变量作为返回值2. 传引用返回编译器傻瓜式判断…

11、循环语句

目录 一、while语句 二、do…while语句 三、for语句 一、while语句 使用while语句可以执行循环结构&#xff0c;其一般形式如下&#xff1a; while语句的执行流程图&#xff1a; while语句首先检验一个条件&#xff0c;也就是括号中的表达式。当条件为真时&#xff0c;就执…

跟同事杠上了,用雪花算法生成的id做主键对MySQL性能有影响?

公司最近开发了一个新项目&#xff0c;设计表时由于有些字段需要对外展示&#xff0c;所以使用了雪花算法生成的id做主键。 不过有位同事对此提出了异议&#xff0c;认为雪花算法生成的id不是顺序递增的&#xff0c;会对MySQL的性能造成影响。 经过交流&#xff0c;发现持有这…

【Linux 系统运维基础】Linux目录 以及重要配置文件

Linux目录 以及重要配置文件 文本讲述了Linux中目录含义 以及我们工作中常用到的路径 1. 目录含义 2. 常用路径地址 2.1 网卡配置文件 /etc/sysconfig/network-scripts但是网卡的名称是有区别的&#xff0c;使用不同服务器生产商的名称是不同的。如下图&#xff1a; 网卡配置…

Window10下FFMPEG的安装与使用

文章目录一.FFMPEG介绍FFMPEG组成二.Windows10下FFMPEG安装三.FFMPEG的使用1.关键指令一.FFMPEG介绍 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它…

字节前端面试题目2

1.为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片&#xff1f; 1. 没有跨域问题&#xff0c;一般这种上报数据&#xff0c;代码要写通用的&#xff1b;&#xff08;排除 ajax&#xff09; 2. 不会阻塞页面加载&#xff0c;影响用户的体验&#xff0c;只…

基于SSM的图书购物商城设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

【C++】三大特性之继承

目录 一、继承的概念及定义 1.继承的概念 2. 继承定义 2.1定义格式 2.2继承关系和访问限定符 2.3继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、友元与继承 六、继承与静态成员 七、复杂的菱形继承及菱…

机器学习中的数学原理——线性不可分

这个专栏主要是用来分享一下我在 机器学习中的 学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎 私信或者评论区留言&#xff01;这一篇就更新一下《 白话机器学习中的数学——线性不可分》&#xff01; 目录 一、什么是线性不可分 二…

用125行C语言编写一个简单的16位虚拟机

改博文用图文代码的方式详细描述了实现的具体过程&#xff0c;包含每一条指令的含义。 虚拟机 在计算领域&#xff0c;VM&#xff08;虚拟机&#xff09;是一个术语&#xff0c;指的是模拟/虚拟化计算机系统/架构的系统。 从广义上讲&#xff0c;有两类虚拟机&#xff1a; 系统…

每日一练11——最近公共祖先求最大连续bit数

文章目录最近公共祖先思路&#xff1a;代码&#xff1a;求最大连续bit数思路&#xff1a;代码&#xff1a;最近公共祖先 题目链接 思路&#xff1a; 题目所描述的满二叉树如下&#xff1a; 上述树中子节点与父节点之间的关系为root child / 2 所以如果a &#xff01; b&a…

递归算法整理

一、概述&#xff1a;递归算法是一种直接或者间接调用自身函数或者方法的算法。说简单了就是程序自身的调用。类似于数列&#xff0c;通过前几项的值推出后几项 二、递归算法的使用条件1.大问题可以拆分为若干小问题2.原问题与子问题除数据规模不同&#xff0c;求解思路完全相同…

自助Active Directory组订阅

在任何基于Windows的企业的身份与访问管理(IAM)战略中&#xff0c;Active Directory组扮演了至关重要的角色&#xff0c;因为它们用来控制对几个资源&#xff08;包括电子邮件通讯组&#xff09;的用户访问。反复地添加用户到组中和从组中移除用户构成了IT管理员工作的有机组成…

C#windows竞赛管理系统

中文摘要 为了提高竞赛项目信息的管理效率&#xff0c;本课题使用C#语言和SQL Server数据库系统开发了一个WinForm类型的竞赛管理系统对竞赛项目信息进行高效管理&#xff0c;以提升管理质量。本系统包含教师登录注册、教师信息修改模块、添加学生信息模块、删除学生信息模块、…

可编程直流电源的介绍 什么是可编程直流电源

现在各种的电子设备不断地发展&#xff0c;它们对直流供电的电源也有了更高的要求&#xff0c;相对于电子设备来说&#xff0c;用单一的直流电源是没有办法达到供电的要求&#xff0c;所以需要不同的直流电源来给电子设备供电。可编程直流电源就是这一种。在生产测试中&#xf…

java:获取本机IP,Linux环境下使用InetAddress.getLocalHost()方法获得127.0.0.1

知道InetAddress.getLocalHost()方法是可以获取本地ip的&#xff0c;但是在mac电脑上执行的时候&#xff0c;偶尔会得到127.0.0.1的输出&#xff0c;这样拿到本地ip很不稳定&#xff0c;感觉就很不靠谱了 目录InetAddress.getLocalHost()方法获取本地IP不靠谱原因获取本地IP的靠…

Python中最简单不过的print语句讲解

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、c 主页&#xff1a;阿玥的小东东 前面使用 print() 函数时&#xff0c;都只输出了一个变量&#xff0c;但实际上 print() 函数完全可以同时输出多个变量&#xff0c;而且它具有更多丰富的功能。 目录 1.格式 2.参考 1…

leetcode-每日一题-1334-阈值距离内邻居最少的城市(中等,floyd)

佛洛依德的变化问法&#xff0c;我之前有文章介绍过佛洛依德算法&#xff0c;不难可以去看看。1334. 阈值距离内邻居最少的城市难度中等94收藏分享切换为英文接收动态反馈有 n 个城市&#xff0c;按从 0 到 n-1 编号。给你一个边数组 edges&#xff0c;其中 edges[i] [fromi, …

如何做数据清洗?

一.预处理阶段 预处理阶段主要做两件事情&#xff1a; 一是将数据导入处理工具。通常来说&#xff0c;建议使用数据库&#xff0c;单机跑数搭建MySQL环境即可。如果数据量大&#xff08;千万级以上&#xff09;&#xff0c;可以使用文本文件存储python操作的方式 而是看数据…

04-jQuery

目录1、jQuery 的属性操作2、jQuery 练习2.1、全选&#xff0c;全不选&#xff0c;反选3、DOM 的增删改4、jQuery 练习二4.1、从左到右&#xff0c;从右到左练习4.2.动态添加、删除表格记录5、CSS 样式操作。6、jQuery 动画练习 6.1、CSS_动画 品牌展示7、jQuery 事件操作7.1、…