插入排序----希尔排序

希尔排序

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个gap组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序

实现

希尔排序是对直接插入排序的一个优化,希尔排序分为预排和正式排序两个阶段,预排是把n个数分成gap组,每个组执行一遍直接插入排序,但是每次end不再是end--或者end+1,而是end-=gap和a[end+gap]=tmp。

gap我们初始给它赋值为n,也就是分成n组,每组一个数,这样的话也就相当于直接插入排序,因为直接插入排序我们是每次挪一个位置和Tmp比较。

for (int i = 0; i < n - gap; i++)
{int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;
}

上述操作也就是把直接插入排序的1换成了gap而已,而这也就相当于gap等于1时候的预排,如果这样操作的话就和直接插入排序没有任何区别,所以我们把gap=n后,第一次预排之前要 gap=gap/3+1;这个操作就是把n个数据分成3组,+1是为了保证让gap不为0,如果gap=2,2/3=0,那分成0组是什么意思?,我把n个数据分成3组进行一次预排,第一次预排之后,每一组肯定都是有序的,这时,gap再进行一次 gap=gap/3+1;也就是再把他划分为更少的组,而我们使gap=gap/3+1,这个加1还有最重要的目的就是一定会使gap=1,所有我们当gap=1时不再往下划分Gap,这个时候就是正式排序

void ShellSort(int* a, int n)//希尔排序
{int gap = n;while (gap > 1){.......}				
}

gap越小,分的组越少,预排的结果越接近有序的。当gap>1时,进行的是预排序,当gap==1,进行的是正式排序。这就是希尔排序。

测试

#include<stdio.h>
int main()
{int a[] = { 6,1,2,7,9,3,4,5,10,8 };int n = sizeof(a) / sizeof(a[0]);ShelltSort(a, n);for (int i = 0; i < n; i++){printf("%d ", a[i]);}return 0;
}

时间复杂度

希尔排序的时间复杂度非常难计算,我们只需要记住它大概在O(N^1.3)左右就可以了。

性能测试

我们使用c语言随机生成的随机数,对这两个排序进行性能测试,我们测试的是1000000个随机数,(由于C语言生成的随机数只能有30000多个,所以我们在每个随机数后面再加上第几次循环的i可以大大减少重复的数据)

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
srand(time(0));
const int N = 1000000;
int* a1 = (int*)malloc(sizeof(int)*N);
int* a2 = (int*)malloc(sizeof(int) * N);
for (int i = 0; i < N; i++)
{a1[i] = rand()+i;a2[i] = a1[i];}
int begin1 = clock();
InsertSort(a1, N);
int end1 = clock();int begin2 = clock();
ShellSort(a2, N);
int end2 = clock();printf("InsertSort:%d\n", end1 - begin1);
printf("ShellSort:%d\n", end2 - begin2);free(a1);
free(a2);

结果如上,由此可以看出,希尔排序无非就是比直接插入排序多了多次预排,直接的差异竟然如此之大。 

源代码

void ShellSort(int* a, int n)//希尔排序
{int gap = n;while (gap > 1){gap = gap/3+1;//+1保证最后一次gap为1,也就是进行直接插入排序;gap越小,预排的结果越接近有序for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}				
}

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

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

相关文章

QT:Unable to create a debugging engine.

debug跑不了&#xff1a; 报错&#xff1a;Unable to create a debugging engine. 参考&#xff1a; https://blog.csdn.net/u010906468/article/details/104716198 先检查是否安装了DEBUG插件 工具-》》选项 查看插件&#xff0c;如果没有的话&#xff0c;需要重新安装qt时…

JavaScript中的for循环

(for循环): for循环- 语法&#xff1a; for(①初始化表达式;②条件表达式;④更新表达式){ ③语句... } - 执行流程&#xff1a; ① for执行时&#xff0c;会首先执行初始化表达式&#xff0c;来初始化变量 ② 执行条件表达式判断循环是否执行 - 判断结果为false&#xf…

加密的艺术:对称加密的奇妙之处(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

一些关于fMRI脑数据的预处理工具

一些关于fMRI脑数据的预处理工具 前言概述SPM12工具箱FSL工具箱FreeSurfer工具箱BrainNet Viewer工具箱circularGraph工具箱Nipype集成框架fMRIPrep集成框架参考文献 前言 March 25, 2022 这里是关于fMRI脑数据的预处理工具的相关调研 主要是关于数据的预处理&#xff0c;数据…

Windows环境提示“‘mysql‘ 不是内部或外部命令,也不是可运行的程序或批处文理件” 简易记录

在Windows环境下使用DOS命令窗登入MYSQL&#xff0c;提示“mysql 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。” 这意味着系统无法找到 mysql.exe可执行文件&#xff0c;这是因为 MySQL 没有正确安装或未添加到系统PATH环境变量中所致。 处理方法&#x…

spring-boot-data-jpa、JPA实现负责查询、复杂搜索

spring-boot-data-jpa、JPA实现负责查询、复杂搜索 JPA越来越丰富了&#xff0c;下面使用springboot3.x实现JPA分页 通过传入Example参数实现复杂字段查询 转自 https://lingkang.top/archives/jpa-shi-xian-fu-ze-cha-xun 依赖 <dependency><groupId>org.spring…

分组背包问题笔记

分组背包是选不同的组&#xff0c;每个组中只能选一个物品。分组背包就是01背包的变种&#xff0c;多重背包就是特殊的分组背包。 //分组背包 #include<iostream> using namespace std; const int N 110; int f[N], v[N], w[N], n, m;int main() {ios::sync_with_stdio(…

ShardingSphereJDBC简单入门

ShardingSphere 介绍ShardingSphere-JDBCSharding-Sphere-ProxyShardingSphere-Sidecar混合架构运行模式DistSQL可拔插架构ShardingSphere的发展路线 主从复制ShardingSphere-JDBC功能SQL解析SQL支持程度SQL稳定支持SQL实验性支持 MySQL不支持SQL清单分页 数据分片垂直分片水平…

飞天使-docker知识点9-dockerfile补充

文章目录 dockerfile.dockerignoreMAINTANIERFROMEXPOSEENVCMD dockerfile 里面的文件首字母必须大写 编译的文件必须放在当前目录&#xff0c;不能放在父目录文件配置好了之后&#xff0c;可以使用docker build 命令进行操作.dockerignore 在使用 Dockerfile 进行构建时&…

509.斐波那契数

题目描述 斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为斐波那契数列。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n > 1。…

Python 爬虫开发完整环境部署,爬虫核心框架安装

Python 爬虫开发完整环境部署 前言&#xff1a; ​ 关于本篇笔记&#xff0c;参考书籍为 《Python 爬虫开发实战3 》 笔记做出来的一方原因是为了自己对 Python 爬虫加深认知&#xff0c;一方面也想为大家解决在爬虫技术区的一些问题&#xff0c;本篇文章所使用的环境为&#x…

关于Ubuntu22.04恢复误删文件的记录

挂载在Ubuntu22.04下的固态盘有文件被误删了&#xff0c;该固态盘是ntfs格式的。 在网上找了很多教程&#xff0c;最后决定用TestDisk工具进行恢复。 现记录如下&#xff1a; Ubuntu安装testdisk sudo apt-get install testdisk运行testdisk sudo testdisk得到 我选择的是…

Linux文件与目录管理

在Linux系统中&#xff0c;文件和目录是最基本的组织单位。了解如何有效地管理和操作文件和目录对于提高工作效率至关重要。本文将介绍Linux文件与目录管理的基本原理和常用命令&#xff0c;帮助读者掌握Linux系统的文件操作技巧。 一、文件与目录的基本概念 文件&#xff1a…

vue打包后el-image图片不出来

结论&#xff1a; publicPath:"/"解决&#xff0c;不能设置相对路径。 环境 可能相关的环境&#xff1a; vue-cli5.0vue3vue-router4 可能的原因 publicPath:“./”路由history路由base 现象 图片异常 img部分图片被转换成了base64可以出来style里url("~…

英伟达 Jetson Xavier/Xavier NX/Orin系统移植编译

英伟达 Jetson Xavier/Xavier NX/Orin系统移植编译 1、下载Jetson BSP包和交叉编译环境 地址&#xff1a;https://developer.nvidia.com/embedded/jetson-linux-archive下载需要版本即可&#xff0c;此次编译采用32.4.2版本 需要下载的文件如下&#xff1a; 2、新建一个文件…

React 列表和键

React 列表和键 大家好&#xff0c;在这一课中&#xff0c;我们将学习如何在 React 中创建和渲染列表。我们还将学习如何使用键来优化列表的性能。 创建列表 我们可以使用 JavaScript 的 map() 方法来创建列表。 const numbers [1, 2, 3, 4, 5]; const listItems numbers…

算法:对称二叉树

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、问题描述 二、递归算法 三、字符串判断法 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、问题描述 有一棵二叉树&#xff0…

LeetCode(66)二叉树的最大深度【二叉树】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 二叉树的最大深度 1.题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7]…

js获取对象数组中重复项的个数并排序,js数组对象筛选出重复数据 并计算 重复了几次

js数组对象筛选出重复数据 并计算 重复了几次 例如&#xff1a; 把以下数据 let arr [{kuaidizhandian:顺丰快递},{kuaidizhandian:邮政快递},{kuaidizhandian:顺丰快递} ]转换为 kuaidarr [{kuaidizhandian:顺丰快递,num&#xff1a;2},{kuaidizhandian:邮政快递,num&…

显示所有已连接的网络连接信息

ECHO OFF & setlocal enabledelayedexpansion TITLE 显示所有已连接的网络连接信息 mode con: cols80 lines30 CALL :get_NIC_info pause>nul EXIT /B 0:get_NIC_info SET "_i_0"ECHO 所有已连接的网络连接信息&#xff08;未插网线不会显示在下方&#xff09…