十大排序算法中的插入排序和希尔排序

文章目录

  • 🐒个人主页
  • 🏅算法思维框架
    • 📖前言:
  • 🎀插入排序 时间复杂度O(n^2)
      • 🎇1. 算法步骤思想
      • 🎇2.动画实现
      • 🎇 3.代码实现
  • 🎀希尔排序 时间复杂度O(n*logn~n^2)
      • 希尔排序的设计依据
      • 🎇1. 算法步骤思想
      • 🎇2、动画演示
      • 🎇3.代码实现

🐒个人主页

🏅算法思维框架

📖前言:

本篇博客主要以介绍十大排序算法中的插入排序和希尔排序,有详细的图解、动画演示、良好的代码注释,帮助加深对这些算法的理解,进行查漏补缺~

🎀插入排序 时间复杂度O(n^2)

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前
扫描,找到相应位置并插入。

🎇1. 算法步骤思想

🪀将待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序 列。
🪀从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

🎇2.动画实现

在这里插入图片描述

🎇 3.代码实现

 public  void sort(int[] arr){if(arr==null||arr.length<2){return;}//思路:先分为有序区间【】与无序区间【】,(默认数组中第一个元素在有序区间内),找到待插入元素insertVal与有序区间的最后一个元素比较//如果insertVal<此有序的值,有序值向后覆盖,往前接着比,直到找到插入即可,如果找到头都没有,放到队首for (int i = 1; i <arr.length ; i++) {//【无序区间】int insertVal=arr[i];boolean flag=true;//判断是否找到了for (int j = i-1; j >=0 ; j--) {//【有序区间】if(insertVal<=arr[j]){//向后覆盖arr[j+1]=arr[j];}else {//找到了arr[j+1]=insertVal;flag=false;//判断已经找到了break;}}//如果找到头都没有最小的,if(flag){arr[0]=insertVal;}}}

🎀希尔排序 时间复杂度O(n*logn~n^2)

希尔排序(Shell Sort) 是一种插入排序的改进版本,它通过将待排序的元素分成若干个子序列,对每个子序列进行插入排序,最终逐步缩小子序列的长度,直到整个序列变为有序。

希尔排序的时间复杂度取决于选择的间隔序列。一般而言,希尔排序的最坏时间复杂度为O(n^2),其中n是要排序的元素个数。但在实际应用中,希尔排序通常表现得比这个理论上界更好,它的平均时间复杂度可以在O(n log n)到O(n^2)之间。

总体而言,希尔排序在某些特定情况下可以比其他简单的排序算法更加高效,但在大多数情况下,现代排序算法如快速排序或归并排序更常被使用,因为它们具有更好的平均时间复杂度。

希尔排序的设计依据

• 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
• 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。

🎇1. 算法步骤思想

选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1; 按增量序列个数 k,对序列进行 k 趟排序;
每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进 行直接插入排序。仅增量因子为 1时,整个序列作为一个表来处理,表长度即为整个序列的长 度。

🎇2、动画演示

🏨希尔排序的动画演示

🎇3.代码实现

  public void sort(int[] arr){if(arr==null||arr.length<2){return;}//思路:先以arr.length/2的步长分组,每一个组进行插入排序,//  再以arr.length/2/2的步长分组,每一个组进行插入排序,直到步长为1,进行整个数组的插入排序//【希尔排序的优势在于:插入排序对 部分有序的序列 排序非常高效】for (int k = arr.length/2; k >=1; k/=2) {//计算步长//i表示第一组中第二个元素【也就是无序区间的第一个元素】//里面是一个插入排序for (int j = k; j <arr.length ; j++) {//每加一次就换一个组,进行一‘步’插入排序,直到数组末尾int insertVal=arr[j];//每个组的无序区间待插入的元素boolean flag=true;for (int i = j-k; i >=0; i-=k) {//因为每k个步长的元素为一组,每组有序区间的最后一个元素if(arr[i]>insertVal){arr[i+k]=arr[i];}else {//找到待插入的位置了arr[i+k]=insertVal;flag=false;break;//退出循环}}//验证极端情况:待插入值是这个组中最小的if(flag){arr[j%k]=insertVal;}}}}

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

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

相关文章

ruoyi-plus-vue docker 部署

本文以 ruoyi-vue-plus 5.x docker 部署为基础 安装虚拟机 部署文档 安装docker 安装docker 安装docker-compose 配置idea环境 上传 /doicker 文件夹 到服务器&#xff1b;赋值 777权限 chmod -R 777 /docker idea构建 jar 包 利用 idea 构建镜像; 创建基础服务 docker…

Vatee万腾的科技探险:vatee数字化力量的前瞻征途

在Vatee万腾的科技探险中&#xff0c;我们领略到了一场数字化力量的前瞻征途&#xff0c;这是一次引领未来的创新之旅。Vatee万腾以其独特的科技理念和数字化力量&#xff0c;开启了一次引领行业的前瞻性征途&#xff0c;为数字化未来描绘出了崭新的篇章。 Vatee万腾的数字化力…

软件工程简明教程

软件工程简明教程 何为软件工程&#xff1f; 1968 年 NATO&#xff08;北大西洋公约组织&#xff09;提出了软件危机&#xff08;Software crisis&#xff09;一词。同年&#xff0c;为了解决软件危机问题&#xff0c;“软件工程”的概念诞生了。一门叫做软件工程的学科也就应…

【nlp】3.6 Tansformer模型构建(编码器与解码器模块耦合)

Tansformer模型构建(编码器与解码器模块耦合) 1. 模型构建介绍2 编码器-解码器结构的代码实现3 Tansformer模型构建过程的代码实现4 小结1. 模型构建介绍 通过上面的小节, 我们已经完成了所有组成部分的实现, 接下来就来实现完整的编码器-解码器结构耦合. Transformer总体架…

ORA-14452: 试图创建, 变更或删除正在使用的临时表中的索引

在编写一个test存储过程中出现一个错误报告:ORA-14452: 试图创建, 变更或删除正在使用的临时表中的索引,代码如下 create or replace PROCEDURE TMP_TRANSCRIPT AS str_sql varchar2(500);v_flag number:0; --标识 begin--判断临时表是否存在SELECT COUNT(*) into v_flag FROM…

【unity实战】实现一个放置3d物品建造装修系统(附项目源码)

文章目录 最终效果前言绘制开始场景素材开始放置旋转物体扩展优化1. 绘制地图边界&#xff0c;确保放置物品在指定区域内工作2. 让模型所占面积大小更加准确3. 隐藏白色瓦片指示区域 最终效果其他源码参考完结 最终效果 前言 其实3d物品建造装修系统之前就已经做过了&#xff…

鸿蒙开发-ArkTS 语言-状态管理

鸿蒙开发-ArkTS 语言-基础语法 3. 状态管理 变量必须被装饰器装饰才能成为状态变量&#xff0c;状态变量的改变才能导致 UI 界面重新渲染 概念描述状态变量被状态装饰器装饰的变量&#xff0c;改变会引起UI的渲染更新。常规变量没有状态的变量&#xff0c;通常应用于辅助计算…

【阿里云】图像识别 智能分类识别 增加垃圾桶开关盖功能点和OLED显示功能点(二)

一、增加垃圾桶开关盖功能 环境准备 二、PWM 频率的公式 三、pthread_detach分离线程&#xff0c;使其在退出时能够自动释放资源 四、具体代码实现 图像识别数据及调试信息wget-log打印日志文件 五、增加OLED显示功能 六、功能点实现语音交互视频 一、增加垃圾桶开关盖功能…

阅读笔记——《Removing RLHF Protections in GPT-4 via Fine-Tuning》

【参考文献】Zhan Q, Fang R, Bindu R, et al. Removing RLHF Protections in GPT-4 via Fine-Tuning[J]. arXiv preprint arXiv:2311.05553, 2023.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&#xff0c;请联系作者删除。 目录 摘要 一、介绍 二、背景 三、方法…

VSCode 连接远程服务器问题及解决办法

端口号不一样&#xff0c;需要在配置文件中添加Port Host 27.223.26.46HostName 27.223.*.*User userForwardAgent yesPort 14111输入密码后可以连接 在vscode界面&#xff0c;终端&#xff0c;生成公钥&私钥 ssh-keygen可以看到有id_rsa和id_rsa.pub两个文件生成&#…

UniWebView 版本3 版本4 版本5介绍

一、介绍 UniWebView是iOS/Android上的web视图组件的包装器&#xff0c;所以运行时拥有与原生web相似性能。是针对Unity所写的插件&#xff0c;节省了项目的开发时间。 官网地址&#xff1a;UniWebView 二、下载&使用 1、下载 &#xff08;1&#xff09;、Unity Asset …

宝塔 Linux 面板安装一个高大上的论坛程序 —— Flarum

这个是很早搭建的版本,基于宝塔面板,比较复杂,如果想要简单的搭建方法,可以参看咕咕新写的这篇: 【好玩的 Docker 项目】10 分钟搭建一个高大上的论坛程序 购买腾讯云轻量应用服务器 待补充 登录服务器 待补充 BBR 加速脚本 BBR 加速脚本: BASH cd /usr/src &…