希尔排序基本思想示例及代码

news2024/11/18 3:48:15

希尔排序是插入排序的一种,直接插入排序相关内容可见:
https://blog.csdn.net/weixin_43978384/article/details/128836898?spm=1001.2014.3001.5502

1、算法思想

希尔排序又称“缩小增量”的排序,属于插入排序的一种。希尔排序的基本思想是先将整个待排序列分割成若干子序列,对子序列分别进行插入排序,待整个序列中的记录基本有序之后,再对整个序列进行一次插入排序。希尔排序的特点是子序列的构成不是简单地“逐段分割”,而是相隔某个“增量”的记录组成一个子序列。

2、应用举例

假设待排序序列如下:
序列 49 38 65 97 76 13 27 49 55 04
当d=5时,关键字分为五组,分别为(R1,R6),(R2,R7),(R3,R8),(R4,R9),(R5,R10)。分别对子序列进行插入排序后的结果为:
序列 13 27 49 55 04 49 38 65 97 76
当d=3时,关键字分为三组,分别为(R1,R4,R7,R10),(R2,R5,R8),(R3,R6,R9)。分别对子序列进行插入排序后的结果为:
序列 13 04 49 38 27 49 55 65 97 76
当d=1时,对整个序列进行一趟插入排序,结果为:
序列 04 13 27 38 49 49 55 65 76 97

3、代码说明

① 算法代码

//一趟希尔排序,增量为d,num[0]是哨兵,暂存待插入的元素 
void shell_insert(int num[],int n,int d){
	int i,j;
	for(i=d+1;i<=n;i++){
		if(num[i]<num[i-d]){//需将当前元素进行排序
			num[0]=num[i];
			for(j=i-d;j>0&&num[j]>num[0];j-=d){//扫描同组元素 
				num[j+d]=num[j];}//for
			num[j+d]=num[0];	
		}//if
	}//for
}//void shell_insert
//对多个增量的希尔排序
void shell_sort(int num[],int n,int d[],int t){//增量存储在d[0..t-1] 
	for(int k=0;k<t;k++){
		shell_insert(num,n,d[k]);//一趟增量为d[k]的插入排序 
	}//for
}//void shell_sort

② 完整代码

#include<bits/stdc++.h>
using namespace std;
//一趟希尔排序,增量为d,num[0]是哨兵,暂存待插入的元素 
void shell_insert(int num[],int n,int d){
	int i,j;
	for(i=d+1;i<=n;i++){
		if(num[i]<num[i-d]){//需将当前元素进行排序
			num[0]=num[i];
			for(j=i-d;j>0&&num[j]>num[0];j-=d){//扫描同组元素 
				num[j+d]=num[j];}//for
			num[j+d]=num[0];	
		}//if
	}//for
	cout<<"输入增量为 d="<<d<<" 的希尔排序结果:";
	for(int i=1;i<=n;i++){
		cout<<num[i]<<" ";
	}
	cout<<endl;	
}//void shell_insert
//对多个增量的希尔排序
void shell_sort(int num[],int n,int d[],int t){//增量存储在d[0..t-1] 
	for(int k=0;k<t;k++){
		shell_insert(num,n,d[k]);//一趟增量为d[k]的插入排序 
	}//for
}//void shell_sort
int main(){
	int n;
	cin>>n;
	int a[n+1];
	for(int i=1;i<=n;i++){
		cin>>a[i];//输入待排序序列 
	} //for
	int t;
	cin>>t;//输入增量
	int d[t];
	for(int i=0;i<t;i++){
		cin>>d[i];
	} //for
	shell_sort(a,n,d,t);
	return 0;	 
}

③ 结果验证

在这里插入图片描述

4、时空复杂度

希尔排序的时间是所取增量的函数,因此它的时间复杂度的分析是一个复杂的问题,到目前为止尚未有人求得一种最好的增量序列。有人在大量的实验基础上推出:当n在某个特定范围内,希尔排序所需的比较和移动次数约为O(n1.3)。
空间复杂度为O(1)。

5、 稳定性

在希尔排序中关键字较小的记录不是一步一步挪动的,而是跳跃式移动,因此希尔排序是不稳定排序。

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

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

相关文章

Springboot+ssm企业员工考勤管理系统

毕业的进度&#xff1a; 第一阶段 系统概要设计&#xff0c;设计系统架构&#xff0c;数据库模型 第二阶段 完成模块的开发与测试 第三阶段 实现主要模块 本公司员工管理系统的设计与实现以Springboot作为框架&#xff0c;B/S模式以及MySql作为后台运行的数据库。…

2023年深圳积分入户考这个软考高级证书错不了!加分真高!

信息系统项目管理师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资…

最完整的文档成像工具包:GdPicture.NET Crack

GdPicture.NET企业级智能 PDF 和文档处理 SDK&#xff0c;使用最先进的人工智能、机器学习和模糊逻辑算法的高度复杂的 API 集。经过超过 15 年专注于创新的持续研究&#xff0c;GdPicture.NET 已成为市场上最全面的PDF、OCR、条形码、文档图像和格式的 SDK 。 最佳文档影像 SD…

设计模式之装饰器模式,以C++为例。

昨天更新了适配器&#xff0c;今天来盘一盘装饰器模式。装饰器模式以一种动态的方式给对象添加额外的职责&#xff0c;好似“装饰”在对象身上一样&#xff0c;通常通过继承和委托来实现。 目录 一、装饰器模式介绍 二、游戏人物如何使用装饰器模式 三、进阶写法&#xff08;…

VScode ssh远程登陆到服务器阅读代码

1、背景介绍在工作中经常使用ssh远程访问服务阅读代码&#xff0c;但是通过ssh远程访问后没有图形界面&#xff0c;阅读代码非常不方便&#xff0c;本文向大家介绍使用VScode通过ssh远程登陆到服务器&#xff0c;本地可视化阅读查看服务器的代码文件。2、安装VS CodeVisual Stu…

Nginx优化

一.设置Nginx运行进程个数 1.查看cpu个数 grep processor /proc/cpuinfo 使用top 按1,也可以查看cpu的核心数 2.设置Nginx进程数 我的cpu数量是4,修改为4 vim /usr/local/nginx/conf/nginx.conf 二.Nginx运行CPU亲和力 vim /usr/local/nginx/conf/nginx.conf 4核4线程配置 注…

叠氮试剂1379690-01-3,3-Azido-D-alanine HCl,3-叠氮-D-丙氨酸HCl

产品规格&#xff1a;3-叠氮-D-丙氨酸HCl&#xff0c;3-Azido-D-alanine HCl1.CAS号&#xff1a;1379690-01-32.分子式&#xff1a;C3H7ClN4O23.分子量&#xff1a;166.566284.包装规格&#xff1a;1g&#xff0c;5g&#xff0c;10g&#xff0c;包装灵活&#xff0c;有100mg包装…

06-Servlet

目录1.Servlet 技术a)什么是 Servletb)手动实现 Servlet 程序&#xff01;这里要自己引入jar包&#xff0c;配置一下tomcat服务器c)url 地址到 Servlet 程序的访问d)Servlet 的生命周期e)GET 和 POST 请求的分发处理f) 通过继承 HttpServlet 实现Servlet 程序g)使用 IDEA 创建S…

小程序项目学习--第八章:播放页功能-代码重构-分包优化-打包发布

第八章:播放页功能-代码重构-分包优化-打包发布 01_(掌握)播放页-歌词分页的上下滚动区域 隐藏滚动条 .lyric-list ::-webkit-scrollbar {display: none; }歌词分页的上下滚动区域动态设置样式 思考什么时候是第一句歌词&#xff0c;什么时候是最后一句歌词 <swiper-ite…

嘉明的云计算与大数据学习之大数据综合实验案例

1.实验环境 (1)Linux:Ubuntu 16.04。 虚拟机镜像下载链接&#xff1a;https://pan.baidu.com/s/1i_B-2rAfPM53jf7Besi0tw 提取码&#xff1a;WZJM (2)MySQL:5.7.16。 (3)Hadoop:2.7.1。 (4)HBase:1.1.5。 (5)Hive:1.2.1。 (6)Sqoop:1.4.6。 (7)R:4.1.2。 (8)Eclipse:3.8。 2.…

Docklight Scripting模拟串行端口

Docklight Scripting模拟串行端口 Docklight是测试、分析和模拟串行端口(RS232、RS485/422等)的工具。此程序允许您监视和测试两个串行端口之间的连接。该程序环境简单&#xff0c;安装在所有Windows XP/7/8/10版本上。Docklight Scripting是一种带有内部编辑器的脚本语言&…

电子会议桌牌——网络版

产品特征&#xff1a; 低功耗&#xff0c;常规使用3-5年电池寿命支持空中唤醒&#xff0c;刷新快速&#xff0c;几秒钟内看到结果点阵电子纸屏幕&#xff0c;视角接近180基于Web的应用界面&#xff0c;支持跨平台操作安装简单&#xff0c;快速布置电池供电不需要布线双面显示…

Python你绝对不知道的15个小技巧,知道的算我输

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python语言、正在学习c语言 主页&#xff1a;阿玥的小东东 目录 前言 1.all or any 2.bashplotlib 3.collections 4.dir 5.from __future__ import 6.python的优点 7.geopy 8.python2.x中的编码不是 unicode &#xff…

转行自学Java没后悔,我的经历证明,改变永远没有错

我在北京工作6年&#xff0c;现在年薪42万&#xff08;仅代表个人收益&#xff09;&#xff0c;目前在搜狐畅游工作&#xff0c;参与过轩辕剑的项目研发&#xff0c;有几个大型项目实战的经历&#xff0c;不过最后这几款项目都失败了。我之所以选择当初学习Java&#xff0c;就一…

我靠CSGO搬砖项目,一个月净赚过万

作为一名四线小城市的平凡上班族&#xff0c;今年已经满30岁了&#xff0c;工资到手也才6000多&#xff0c;已经不记得有多少年没涨过了。 后来通过CSGO搬运项目&#xff0c;每月副业收益稳定在5万的收益。 废话不多说&#xff0c;先给大家瞅瞅我上个月带货的收益&#xff0c…

为什么要上机械设备ERP系统?对企业管理有什么帮助?

机械设备制造行业是国民经济增长的重要支撑&#xff0c;随着信息化的发展&#xff0c;机械设备制造企业面临各种各样的挑战&#xff0c;频繁地出现部门监管力度不够、生产计划难定、产品质量不过关、生产过程操作不规范以及原材料使用不当等&#xff0c;造成资源浪费的现象&…

规则引擎设计与实现

规则引擎设计与实现 「字节跳动第五届青训营」笔记 是什么 规则引擎是一种嵌入在应用程序中的组件&#xff0c;实现了将业务决策从应用程序代码中分离出来&#xff0c;并 使用预定义的语义模块编写业务决策。接受数据输入&#xff0c;解释业务规则&#xff0c;并根据业务规则…

用最简单的方法实现个人网站-wordpress结合LAMP架构实战

文章目录前言一、LAMP架构是什么&#xff1f;1.1 LAMP架构简介1.2 什么是apache?1.3 什么是MySQL&#xff1f;1.4 什么是php&#xff1f;二. wordpress是什么三. 搭建博客过程1. 实验环境2. 搭建LAMP架构3. 设置数据库并授权4. 上传wordpress并解压5. 修改配置文件6. 网页端进…

基于C#制作一个网址检测工具

此文主要基于C#制作一个网址检测工具。随着时间推移以及公司人员的变动&#xff0c;手头所负责的项目也越来越多&#xff0c;对网站运行状况的管理也是一件让人十分头疼的事&#xff0c;秉持着偷懒是第一生产力的原则&#xff0c;制作一个工具对网址一键监测。 实现流程1、创建…

支付测试怎么做?要点有哪些?

目录 支付测试 避不开的 公司有没有支付牌照的问题&#xff1f; 国内有支付牌照的公司&#xff08;搞一张支付牌照 &#xff0c;不是钱多少的事&#xff09;总共 200 多家而已​编辑 没有支付牌照 公司就不可以支付么&#xff1f; 没有支付牌照 的公司的支付 做的什么支付&…