当前位置: 首页 > news >正文

直接插入排序、希尔排序详解。及性能比较

直接插入排序、希尔排序详解。及性能比较

  • 一、 直接插入排序
      • 1.1 插入排序原理
      • 1.2 代码实现
      • 1.3 直接插入排序特点总结
  • 二、希尔排序 ( 缩小增量排序 )
      • 2.1 希尔排序原理
      • 2.2 代码实现
      • 2.3 希尔排序特点总结
  • 三、直接插入排序和希尔排序性能大比拼 !!!
      • 3.1 如何对比性能?准备工作
      • 3.2 如何实现?
        • 创建数据
        • 比较快慢
        • 代码、结果分析


一、 直接插入排序

1.1 插入排序原理

直接插入排序是一种简单的插入排序法,其基本原理是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
 
在这里插入图片描述
而实际中我们玩扑克牌时,就用了插入排序的思想
在这里插入图片描述


1.2 代码实现

【代码思路】:直接插入排序还是比较简单的。我们将第一个元素当作一个有序序列,然后从第二个元素开始,将其作为当前插入的元素,并与已排序部分的元素进行比较,找到合适的插入位置。然后不断重复上述操作,直到所有元素都被插入到已排序部分。
 
当插入第i(i>=1)个元素时,前面的a[0], a[1], …, a[i-1]已经排好序,此时用a[i]的排序码与a[i-1],a[i-2],…的排序码顺序进行比较,找到插入位置即将a[i]插入,原来位置上的元素顺序后移。

void InsertSort(int* a, int n)//排升序
{for (int i = 0; i < n-1; i++){int end = i;//tmp记录待插入元素,因为插入数据时需要挪动数据,会被覆盖int tmp = a[end+1];//[0,end]有序,将tmp插入到合适位置while (end >= 0){if (a[end] > tmp){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}

1.3 直接插入排序特点总结

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高。
  2. 时间复杂度:O(N^2)。并且是时间复杂度为 N^2的所有算法中最快的排序。
  3. 空间复杂度:O(1),它是一种稳定的排序算法。

二、希尔排序 ( 缩小增量排序 )

逆序有序的数组进行插入排序时,时间复杂度为O ( n^2 ),此时效率最低。

​ 顺序有序的数组进行插入排序时,时间复杂度为O ( n ),此时效率最高。

​我们发现,当被排序的对象越接近有序时,插入排序的效率越高,那我们是否有办法将数组变成接近有序后再用插入排序,此时希尔大佬就发现了这个排序算法,并命名为希尔排序


2.1 希尔排序原理

希尔排序法又称缩小增量法。为了提高插入排序效率,希尔给出了这样一个办法:
将原有大量数据进行分组,分割成若干个子序列,此时每个子序列待排序的个数就减少了。然后对这些子序列分别进行插入排序(目的在于使较小的数据基本在前面,较大的数据基本在后面,而不大不小的数据则位于中间,从而达到排序基本有序的目的)。当整个序列基本有序时,最后在全体进行一次插入排序即可。


2.2 代码实现

【代码思路】:首先确定希尔排序的间距(gap),可以根据不同的方法选择不同的间距。根据选择的间距,将待排序的数组分割成若干个子序列,使用插入排序对每个子序列进行排序。逐步减小间距,重复第二步,直到间距为1。此时,整个数组被分割成了一个子序列,即原始的待排序序列。最后对原始的待排序序列进行插入排序,最终得到有序数组。(这里博主建议gap=n(数据个数)/ 3,在不断更新gap)

在这里插入图片描述

void ShellSort(int* a, int n)
{//1. gap>1 预排序//2. gap=1 插入排序int gap = n;while (gap > 1){gap = gap / 3 + 1;//多组并排for (int j = 0; j < n - gap; j++){int end = j;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;}}
}

2.3 希尔排序特点总结

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。
  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定:
    《数据结构(C语言版)》— 严蔚敏
    在这里插入图片描述
    《数据结构-用面相对象方法与C++描述》— 殷人昆
    在这里插入图片描述
    因为此处的gap是按照Knuth提出的方式取值的,而且Knuth进行了大量的试验统计,我们暂时就按照:O(n^1.25) ~ O(1.6 * n^1.25)。

三、直接插入排序和希尔排序性能大比拼 !!!

希尔排序虽然看起来比较普通,但实际性能可以和快排以及堆排序达到一个量级!!!

3.1 如何对比性能?准备工作

要对比两算法性能,首先创建一个包含大量元素的随机数组,这个数组将用于测试两个排序算法的效率。并且要确保测试数据集的大小足够大,以便能够准确测量算法的效率。在分别对两个排序算法在相同的测试数据集上进行排序,并记录每个算法排序所花费的时间。最后将两个排序算法的排序时间进行比较即可
 
Tips:
①:在对比两个排序算法的效率时,需要确保使用相同的编程语言和相同的测试数据集。
②::编译器切换到Release模式。
在这里插入图片描述
至于原因就得提到Release的特点了。
Release模式可以优化代码的性能和执行速度,减少调试信息的冗余,并提高程序的运行效率。在对比两个算法时,这些优化和调试信息并不是必需的。


3.2 如何实现?

创建数据

首先为两个为两个待排序数组创建足够大的存储空间,然后调用rand()随机生成数据。为保证两待排数组中的数据一样,将随机生成的数据依次赋值给两数组。

比较快慢

要比较两则运行时间,可以调用clock()函数,就可以轻松得到算法执行时间了!!
 
CPlusPlus:clock()
(clock()计算的是程序运行开始到执行此函数的运行时间,单位ms)

代码、结果分析

void TestOP()
{srand((unsigned int)time(NULL));//博主受限电脑配置,数据只能建10000个。//各位可适当扩大数据,两则差距更明显const int N = 100000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);for (int i = 0; i < N; ++i){a1[i] = rand();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);
}

运行结构:
在这里插入图片描述
上述结果我们直观发现,希尔排序性能远远大于直接插入排序。
可能有部分学者还是感受不出来,你可以将数据个数扩大到百万看看就知道了。


在这里插入图片描述
在这里插入图片描述

相关文章:

直接插入排序、希尔排序详解。及性能比较

直接插入排序、希尔排序详解。及性能比较 一、 直接插入排序1.1 插入排序原理1.2 代码实现1.3 直接插入排序特点总结 二、希尔排序 ( 缩小增量排序 )2.1 希尔排序原理2.2 代码实现2.3 希尔排序特点总结 三、直接插入排序和希尔排序性能大比拼 !!!3.1 如何对比性能&#xff1f;准…...

2023备战秋招Java面试八股文合集

Java就业大环境仍然根基稳定&#xff0c;市场上有很多机会&#xff0c;技术好的人前景就好&#xff0c;就看你有多大本事了。小编得到了一份很不错的资源&#xff0c;建议大家可以认真地来看看以下的资料&#xff0c;来提升一下自己的核心竞争力&#xff0c;在面试中轻松应对面…...

SLAM中的二进制词袋生成过程和工作原理

长期视觉SLAM (Simultaneous Localization and Mapping)最重要的要求之一是鲁棒的位置识别。经过一段探索期后&#xff0c;当长时间未观测到的区域重新观测时&#xff0c;标准匹配算法失效。 当它们被健壮地检测到时&#xff0c;回环检测提供正确的数据关联以获得一致的地图。…...

算法训练第五十九天

503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> nums1(nums.begin(), nums.end());nums.insert(nums.end(), nums1.beg…...

二叉树oj题

目录 层序遍历(一) 题目 思路 代码 层序遍历(二) 题目 思路 代码 根据二叉树创建字符串 题目 思路 代码 二叉树的最近公共祖先 题目 思路 代码 暴力版 队列版 栈版 bs树和双向链表 题目 思路 代码 前序中序序列构建二叉树 题目 思路 代码 中序后序…...

华为数通方向HCIP-DataCom H12-831题库(单选题:1-20)

第1题 关于IPSG下列说法错误的是? A、IPSG可以防范IP地址欺骗攻击 B、IPSG是一种基于三层接口的源IP地址过滤技术 C、IPSG可以开启IP报文检查告警功能,联动网管进行告警 D、可以通过IPSG防止主机私自更改IP地址 答案: B 解析: IPSG(入侵防护系统)并不是基于三层接口的源I…...

TableConvert-免费在线表格转工具 让表格转换变得更容易

在线表格转工具TableConvert TableConvert 是一个基于web的免费且强大在线表格转换工具&#xff0c;它可以在 Excel、CSV、LaTeX 表格、HTML、JSON 数组、insert SQL、Markdown 表格 和 MediaWiki 表格等之间进行互相转换&#xff0c;也可以通过在线表格编辑器轻松的创建和生成…...

伦敦金实时行情中的震荡

不知道各位伦敦金投资者&#xff0c;曾经花过多长的时间来观察行情走势的表现&#xff0c;不知道大家是否有统计过&#xff0c;其实行情有60%-70%的时间&#xff0c;都会处于没有明显方向的震荡行情之中呢&#xff1f;面对长期的震荡行情&#xff0c;伦敦金投资者道理应该如何应…...

蓝桥杯打卡Day7

文章目录 阶乘的末尾0整除问题 一、阶乘的末尾0IO链接 本题思路&#xff1a;由于本题需要求阶乘的末尾0&#xff0c;由于我们知道2*510可以得到一个0&#xff0c;那么我们就可以找出2的数和5的数&#xff0c;但是由于是阶乘&#xff0c;所以5的数量肯定是小于2的数量&#xf…...

Mobile Vision Transformer-based Visual Object Tracking

论文作者&#xff1a;Goutam Yelluru Gopal,Maria A. Amer 作者单位&#xff1a;Concordia University 论文链接&#xff1a;https://arxiv.org/pdf/2309.05829v1.pdf 项目链接&#xff1a;https://github.com/goutamyg/MVT 内容简介&#xff1a; 1&#xff09;方向&#…...

HTTP反爬困境

尊敬的程序员朋友们&#xff0c;大家好&#xff01;今天我要和您分享一篇关于解决反爬困境的文章。在网络爬虫的时代&#xff0c;许多网站采取了反爬措施来保护自己的数据资源。然而&#xff0c;作为程序员&#xff0c;我们有着聪明才智和技术能力&#xff0c;可以应对这些困境…...

从零开始探索C语言(九)----函数指针与回调函数

函数指针 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量&#xff0c;而函数指针是指向函数。 函数指针可以像一般函数一样&#xff0c;用于调用函数、传递参数。 函数指针变量的声明&#xff1a; typedef int (*fun_ptr)(int,i…...

智慧工厂的基础是什么?功能有哪些?

关键词&#xff1a;智慧工厂、智慧工厂数字化、设备设施数字化、智能运维、工业互联网 1.智慧工厂的定义 智慧工厂是以数字化信息形式的工厂模型为基础&#xff0c;以实现制造系统离线分析设计和实际生产系统运行状态在线监控的新型工厂。智慧工厂的建设在于以高度集成的信息化…...

LeetCode 238. 除自身以外数组的乘积

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 使用前缀和进行解决该题&#xff0c;只不过与之前前缀和不同的是这个题目计算前缀和的时候不需要计算当前元素&#xff0c;也就是当前位置前缀和的值其实是不包含当前元素的前缀和。…...

点击劫持概念及解决办法

1.点击劫持的概念 点击劫持 (Clickjacking) 技术又称为界面伪装攻击 (UI redress attack )&#xff0c;是一种视觉上的欺骗手段。攻击者使用一个或多个透明的 iframe 覆盖在一个正常的网页上&#xff0c;然后诱使用户在该网页上进行操作&#xff0c;当用户在不知情的情况下点击…...

【Spring】手动实现Spring底层机制-问题的引出

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理手动实现Spring底层机制-问题的引出 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1…...

Java - List 去重,获取唯一值,分组列出所属对应集合

问题&#xff1a;List 去重&#xff0c;获取唯一值&#xff0c;分组列出所属对应集合 方案一&#xff1a;这个不需要额外的内存占用 //遍历后判断赋给另一个list集合public static void main(String[] args){List<String> list new ArrayList<String>(); lis…...

离散高斯抽样(Discrete Gaussian Sampling)

离散高斯抽样 离散高斯抽样&#xff08;Discrete Gaussian Sampling&#xff09;是一种常见于密码学和数学领域的随机采样方法。它通常用于构建基于格&#xff08;lattice&#xff09;的密码学方案&#xff0c;如基于格的加密和数字签名。Discrete Gaussian Sampling 的主要目…...

Elasticsearch:什么是生成式人工智能?

生成式人工智能定义 给学生的解释&#xff08;基本&#xff09;&#xff1a; 生成式人工智能是一种可以创造新的原创内容的技术&#xff0c;例如艺术、音乐、软件代码和写作。 当用户输入提示时&#xff0c;人工智能会根据从互联网上现有示例中学到的知识生成响应&#xff0c;…...

责任链模式让我的代码精简10倍?

目录 什么是责任链使用场景结语 前言最近&#xff0c;我让团队内一位成员写了一个导入功能。他使用了责任链模式&#xff0c;代码堆的非常多&#xff0c;bug 也多&#xff0c;没有达到我预期的效果。实际上&#xff0c;针对导入功能&#xff0c;我认为模版方法更合适&#xff…...

Draw软件安装下载

Draw软件安装下载 1.软件简介2.软件下载3.安装方法 1.软件简介 Draw软件&#xff0c;全名为LibreOffice Draw&#xff0c;是一款免费、开源的2D矢量绘图软件&#xff0c;属于LibreOffice办公套件的一部分。它可以用来创建各种类型的图形&#xff0c;包括流程图、组织结构图、平…...

uniapp代码混淆ios上架43问题

参考文章&#xff1a;uniapp打包ios apk&#xff0c;混淆代码_uniapp 混淆_酸奶自由竟然重名了的博客-CSDN博客 uniapp打包ios&#xff0c;上传到ios应用市场时&#xff0c;会因为 4.3(代码重复率过高) 无法通过审核&#xff0c;此时可通过混淆代码来通过审核 1. 项目终端 安…...

Linux目录遍历函数

1.打开一个目录 #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); 参数&#xff1a; -name:需要打开的目录的名称 返回值&#xff1a; DIR * 类型&#xff0c;理解为目录流 错误返回NULL 2.读取目录中的数据 #include <dirent.h…...

数据库-理论基础

目录 1.什么是数据库&#xff1f; 2.数据库与文件系统的区别&#xff1f; 3.常见的数据库由那些&#xff1f; 4.关系型数据库(MySQL&#xff09;的特征及组成结构介绍 1.什么是数据库&#xff1f; 数据&#xff1a;描述事物的符号记录&#xff0c;可以是数字&#xff0c;文…...

【已解决】src/spt_python.h:14:20: 致命错误:Python.h:没有那个文件或目录

src/spt_python.h:14:20: 致命错误&#xff1a;Python.h&#xff1a;没有那个文件或目录 问题 其中重点的报错信息 src/spt_python.h:14:20: fatal error: Python.h: No such file or directory 思路 sudo yum install python-devel然后重新安装需要的依赖。 解决 成功。…...

基于Face++网络爬虫+人脸融合算法智能发型推荐程序——深度学习算法应用(含Python及打包exe工程源码)+爬虫数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境 模块实现1. Face.APl调用1&#xff09;Face.APl介绍2&#xff09;调用API 2. 数据爬取1&#xff09;网络数据爬取步骤2&#xff09;爬虫实现 3. 模型构建4. 用户界面设计1&#xff09;需要调用的库文…...

Jetson nano嵌入式平台配置ip记录

背景 Jetson nano平台使用千兆网和PC连接时没有ip地址&#xff0c;在ubuntu的终端输入ifconfig显示eh0未设置ip&#xff0c;需要先在nano平台上配置ip地址&#xff0c;然后PC通过千兆网远程控制该平台。 配置ip 使用终端进入到network文件夹中&#xff0c; cd /etc/network…...

前端中的跨域请求及其解决方案

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 跨域&#xff08;Cross-Origin&#xff09;⭐CORS&#xff08;跨域资源共享&#xff09;⭐JSONP&#xff08;JSON with Padding&#xff09;⭐代理服务器⭐ WebSocket⭐服务器设置响应头⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a…...

SpringBoot2.0(mybatis-plus初始使用)

目录 一&#xff0c;介绍二&#xff0c;SpringBoot2.x整合MybatisPlus Lombok2.1&#xff0c;添加依赖 pom2.2&#xff0c;配置数据库信息 application.properties2.3&#xff0c;工程结构初始化 三&#xff0c;创建接口返回统一对象四&#xff0c;创建bean五&#xff0c;创建…...

游戏视频录制软件对比,哪款最适合你的需求?

随着电子竞技和游戏直播行业的迅速崛起&#xff0c;越来越多的玩家渴望记录并分享自己在游戏中的精彩瞬间。游戏视频录制软件正是满足这一需求的关键工具。本文将针对三款优秀的游戏视频录制软件进行对比分析&#xff0c;以便为读者提供选购建议。 游戏视频录制软件1&#xff1…...

网站建设发布平台/网站关键词优化费用

winhex镜像硬盘和ghost备份是完全不同的&#xff0c;ghost只能克隆或者镜像分区内正常的数据&#xff0c;删除的数据他是不会克隆的&#xff0c;所以在数据恢复应用中&#xff0c;ghost对我们来讲作用就不大了&#xff0c;而使用winhex备份&#xff08;镜像&#xff09;硬盘数据…...

辽宁省精神文明建设工作三大创建活动网站/360推广

当满足以下三个条件时&#xff0c;两者会输出相同信息。 1. 服务器为80端口 2. apache的conf中ServerName设置正确 3. HTTP/1.1协议规范 不同点&#xff1a; 通常情况&#xff1a; _SERVER[“HTTP_HOST”] 在HTTP/1.1协议规范下&#xff0c;会根据客户端的HTTP请求输出信息…...

哪种语言的网站 做seo更好/百度百科入口

指针的偏移值是多少取决于指针的类型&#xff1a; int a 10; char c A;int *p; char *p2;p &a; p2 &c;//p &#xff08;自身运算&#xff09;之后再加1 printf("a的地址的打印:%p\n",p); //p &#xff08;自身加1运算&#xff09;之后再下一步 …...

广西玉林网站建设正规公司/推广手段和渠道有哪些

分布式应用系统中&#xff0c;经常会用到zk&#xff0c;比如dubbo注册中心&#xff0c;kafka分布式集群等都用到zk这一工具。除了这些用来做分布式集群外&#xff0c;zk还有那西应用场景事我们可以使用到该工具的呢&#xff1f;所以接下来就是我们要了解的重点了。 首先在使用z…...

wordpress EDD Alipay/关键词seo排名公司

在亚马逊云科技&#xff0c;有着这么一群人&#xff0c;他们经常被认为只会写代码&#xff0c;而不善言辞。但这只是大家对他们的误解。他们的工作不仅需要懂开发、善沟通&#xff0c;还需要能够dive deep用户的需求。他们就是亚马逊云科技的 Software Dev Engineer&#xff01…...

黑龙江能源建设网站/最新的疫情情况

jupyter notebook 需要用谷歌浏览器打开才可以&#xff0c;其他的浏览器打开后多半是空白的。添加默认浏览器如下&#xff1a; 1.在anaconda prompt 里面直接输入 jupyter notebook --generate-config 让jupyter生成一个配置文件&#xff0c;生成后你会看到文件地址的2.然后就可…...