排序:直接插入排序希尔排序

news2024/11/24 9:45:56

目录

排序:

概念:

直接插入排序: 

代码的实现: 

代码解析: 

总结:

希尔排序: 

代码实现: 

预排序: 

代码优化: 

gap 的 本质  :

直接插入排序: 

代码图解:

总结: 

排序:

概念:

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

而通过排序中的元素交换次数和排序所需要的次数,排序可以分为两层:

  • 内部排序:数据元素全部放在内存中的排序。
  • 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。 

直接插入排序: 

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列 。 

  • 简单来说,直接插入排序的前提是需要有一个有序的序列作为基础。

实际中我们玩扑克牌时,就用了插入排序的思想 

代码的实现: 

 代码的实现本质上也分为内外两层结构。

直接插入排序的内层是用来实现有序序列的排序,而直接插入排序的外层则是用来扩大排序的范围。

代码解析: 

如图所示,以升序为例,直接插入排序的内层进行寻找插入元素应当插入的位置和对原来排序中的元素进行移位,以此保持插入元素后仍能保持有序。

插入排序的外层是进行引入 插入的元素和扩大有序排序的范围,以此将整个数组变为 一个有序排序。

总结,通过内层将一个无序数组的一部分变成有序排序,通过外层扩大有序排序的范围最后将整个数组变成有序数组。

总结:

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

希尔排序: 

希尔排序分为预排序和直接插入排序 

  • 预排序是又称接近有序排序的排序,它是将数组内的元素进行分组,每一组内进行直接插入排序。
  • 当每一组都完成排序后,在对整个数组进行直接插入排序。

  •  如下图所示,每个三个间隙为一组进行直接插入排序。

  • 当然不止是分为这一组! 

代码实现: 

预排序: 

预排序的内部和直接排序毫无区别,只是进行将数组分为了几组,在组内进行元素的交换 

  • n-gap :如果大于了这个范围,那么可能会越界访问
  • j 表示 组数,总共有gap 组

gap不仅表示间隔几个一组也表示总共分为几组,因为如果每一个元素都和与它相隔gap个间隔的交换判断会有重复的,所以干脆分为gap组,这下将gap组全部内部直接插入排序完后在进行直接插入排序。

简单来说这是一组内的元素全部进行了比较交换后开始第二组,也就是while走完后,进入了外层的for表示开始第二组交换。

代码优化: 

如上文所诉,本次的代码可能会出现重复的交换检查,但是这并不会对代码造成任何印象,反倒是对代码起到了简化的作用。

如果上上文讲诉的代码是单独将一组出来交换后换下一组交换,而这一个代码则是一组交换完一对元素后换下一组交换一对元素 。

gap 的 本质  :
  • gap越大,大的值更快调到后面,小的值可以更快的调到前面,越不接近有序gap越小,跳得越慢,但是越接近有序。
  • 如果gap==1就是直接插入排序。
  • 如果 gap > 1 就是预排序

直接插入排序: 

因为 n 越大 gap 就必须变大,而gap 变大跳的范围越大,排序也就越不有序,所以导致了gap 这个值的不固定,但是 对于这个问题可以使用多次预排序进行解决。

  • 每次预排序结束后将gap的值缩小以此来将整个数组变得接近有序,直到 gap == 1时 完成最后的 希尔排序的 第二步——直接插入排序。

代码图解:

总结: 

希尔排序其实就是直接插入排序的升级版本,本质上是将数组中的元素分为多组进行直接排序后,在将整个数组进行直接排序。 


 

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

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

相关文章

千梦网创:设计一个100%回本赚钱的培训模式

互联网上搞培训,牌坊立的快,倒的也快。 你会的东西你教了才能赚钱,你想赚钱你就要教。 你只要教了,立马就有人模仿,立马就有人收费比你更低。 所以,你不会变,你没有核心的东西,就…

日本IT行业发展前景怎么样呢?

由于日本劳动力短缺,招聘外国IT工程师的公司越来越多,目前,日本IT行业有约28,000多名外国工程师,占所有日本IT工程师的3%。随着大量海外人才涌入日本,预计这一数字还会进一步增长,所以有不少人想要转行做赴…

RHCE作业

目录 1、搭建一个通过网址https://www.openlab.com/money访问的缴费网站,网站内容为money 2、配置DNS的正向解析 1、搭建一个通过网址https://www.openlab.com/money访问的缴费网站,网站内容为money 首先查看自己是不是有nginx的包没有的话装一个 首…

ModStartCMS v7.7.0 集成内容区块,文件选择顺序

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议,免费且不限制商业使用。 功能特性 丰富的模块市…

智能优化算法应用:基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鼠群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

mapbox系列:常见功能使用总结

前言 最近在写一个大屏的时候使用mapbox,将开发过程进行总结如下: 功能1:mapbox logo显示与隐藏 使用mapbox时地图上会有mapbox的logo,如下: 设置地图全局样式设置 :deep(.mapboxgl-ctrl) {display: none !import…

第十五届蓝桥杯模拟赛B组(第二期)C++

前言: 第一次做蓝桥模拟赛的博客记录,可能有很多不足的地方,现在将第十五届蓝桥杯模拟赛B组(第二期)的题目与代码与大家进行分享,我是用C做的,有好几道算法题当时自己做的也是一脸懵&#xff0c…

R语言学习

Part1阶段1:入门基础 1安装R和RStudio: 下载并安装R:https://cran.r-project.org/ 下载并安装RStudio:https://www.rstudio.com/products/rstudio/download/ 2Hello World: 学习如何在R中输出"Hello, World!"…

苹果OS X系统介绍(Mac OS --> Mac OS X --> OS X --> macOS)

文章目录 OS X系统介绍历史与版本架构内核与低级系统图形,媒体和用户界面应用程序和服务 特性用户友好强大的命令行安全性集成与互操作性 总结 OS X系统介绍 OS X是由苹果公司为Macintosh计算机系列设计的基于UNIX的操作系统。其界面友好,易于使用&…

论文阅读:Distributed Initialization for VIRO with Position-Unknown UWB Network

前言 Distributed Initialization for Visual-Inertial-Ranging Odometry with Position-Unknown UWB Network这篇论文是发表在ICRA 2023上的一篇文章,本文提出了一种基于位置未知UWB网络的一致性视觉惯性紧耦合优化测距算法( DC-VIRO )的分布式初始化方法。 对于…

【从删库到跑路 | MySQL数据库总结篇】JDBC编程

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、前言…

【Linux】信号的保存和捕捉

文章目录 一、信号的保存——信号的三个表——block表,pending表,handler表sigset_t信号集操作函数——用户层sigprocmask和sigpending——内核层 二、信号的捕捉重谈进程地址空间(第三次)用户态和内核态sigaction可重入函数volat…

技术博客:Vue中各种混淆用法汇总

​ 摘要 本文主要介绍了在Vue中使用的一些常见混淆用法,包括new Vue()、export default {}、createApp()、Vue.component、Vue3注册全局组件、Vue.use()等,以及如何使用混淆器对代码进行加固,保护应用安全。 引言 在Vue开发中,…

java小工具util系列3:JSON转实体类对象工具

文章目录 准备工作1.JSONObject获取所有的key2.集合中实体对象转换 list中Enrey转Dto3.字符串转List<BusyTimeIndicatorAlarmThreshold>4.json字符串转JSONObject5.list根据ids数组过滤list6.json字符串转JavaBean对象7.json对象转javabean8.jsonObject转map9.List\<U…

007:vue实现与iframe实现页面数据通信

首页先搭建一个html页面和vue页面&#xff0c;在vue页面中&#xff0c;嵌入我们需要的iframe页面 文章目录 1. 搭建 html 页面和 vue 页面2. 实现 iframe 向 vue 页面通信3. 在实现 vue 向 iframe 页面通信 1. 搭建 html 页面和 vue 页面 暂定为 iframeDemo.html 和 vueDemo.v…

电子版简历模板精选5篇

电子版简历模板模板下载&#xff08;可在线编辑制作&#xff09;&#xff1a;做好简历&#xff0c;来幻主简历。 电子版简历1&#xff1a; 求职意向 求职类型&#xff1a;全职 意向岗位&#xff1a;ERP咨询顾问 意向城市&#xff1a;北京市 薪资要求&#xff1a;…

Vue 应用程序性能优化:代码压缩、加密和混淆配置详解

简介 在 Vue 应用程序的开发中&#xff0c;代码压缩、加密和混淆是优化应用程序性能和提高安全性的重要步骤。 Vue CLI 是一个功能强大的开发工具&#xff0c;它提供了方便的配置选项来实现这些功能。本文将介绍如何使用 Vue CLI 配置代码压缩、加密和混淆功能&#xff0c;以提…

【矩阵论】Chapter 6—矩阵分解知识点总结复习(附Python实现)

文章目录 1 满秩分解&#xff08;Full-Rank Factorization&#xff09;2 三角分解&#xff08;Triangular Factorization&#xff09;3 正交三角分解&#xff08;QR Factorization&#xff09;4 奇异值分解&#xff08;SVD&#xff09; 1 满秩分解&#xff08;Full-Rank Factor…

【数电笔记】07-基本和复合逻辑运算

目录 说明&#xff1a; 基本逻辑运算 1. 与运算 &#xff08;and gate&#xff09; 2. 或运算 &#xff08;or gate&#xff09; 3. 非运算 &#xff08;not gate &#xff09; 复合逻辑运算 1. 与非运算&#xff08;nand&#xff09; 2. 或非运算&#xff08;nor&…

【python】保存excel

正确安装了pandas和openpyxl库。 可以通过在命令行中输入以下命令来检查&#xff1a; pip show pandas pip show openpyxl 可以使用pip安装 pip install pandas pip install openpyxl#更新 pip install --upgrade pandas pip install --upgrade openpyxl 保存excel …