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

文章目录

  • 🐒个人主页
  • 🏅算法思维框架
    • 📖前言:
  • 🎀插入排序 时间复杂度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.mzph.cn/news/168878.shtml

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

相关文章

Matplotlib图形配置与样式表_Python数据分析与可视化

Matplotlib图形配置与样式表 配置图形修改默认配置rcParams样式表 Matplotlib的默认图形设置经常被用户诟病。虽然2.0版本已经有了很大改善&#xff0c;但是掌握自定义配置的方法可以让我们打造自己的艺术风格。 配置图形 我们可以通过修个单个图形配置&#xff0c;使得最终图…

【Web】攻防世界 难度3 刷题记录(1)

目录 ①lottery ②ics-05 ③mfw ④simple_js ⑤fakebook 感觉自己对一些综合题的熟练度不太够&#xff0c;专项训练一下 ①lottery 抽奖赚钱&#xff0c;钱够9990000可买flag 随便输一串数字抓包&#xff0c;然后查看到一个post请求&#xff0c;api.php,题目里面有附件…

基于C#实现外排序

一、N 路归并排序 1.1、概序 我们知道算法中有一种叫做分治思想&#xff0c;一个大问题我们可以采取分而治之&#xff0c;各个突破&#xff0c;当子问题解决了&#xff0c;大问题也就 KO 了&#xff0c;还有一点我们知道内排序的归并排序是采用二路归并的&#xff0c;因为分治…

MySQL与PostgreSQL 的一些SQL

MySQL 1、MYSQL输出重定向 将SQL内容输出到文件 nohup mysql -h127.0.0.1 -uroot -ppassword -Ne "sql语句;" > /home/mysql/data/xxxxx.txt &2、时间格式转换 时间转换&#xff0c;转10位时间戳 select UNIX_TIMESTAMP(2021-02-27 00:00:00)SELECT …

机器学习中的混淆矩阵

混淆矩阵是用于评估分类模型性能的表格&#xff0c;它展示了模型在不同类别上的预测情况。对于二分类问题&#xff0c;混淆矩阵的构成如下&#xff1a; 假设有两个类别&#xff1a;正例&#xff08;Positive&#xff09;和负例&#xff08;Negative&#xff09;。 真正例&…

小总结----长度

看了上一篇文章&#xff0c;已经一年没发了。CSDN也越来越封闭了&#xff0c;查点东西&#xff0c;也很不友好。 来个小总结吧&#xff1a;完成团队建设&#xff0c;招聘11人。完成26项开发&#xff0c;内部9项&#xff0c;科创10项。2023发明专利申请两项&#xff0c;软著申请…

【Leetcode合集】20. 有效的括号

20. 有效的括号 20. 有效的括号 代码仓库地址&#xff1a; https://github.com/slience-me/Leetcode 个人博客 &#xff1a;https://slienceme.xyz 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串…

一盏茶的时间,入门 Node.js

一、.什么是 Node.js&#xff1f; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;用于构建高性能、可伸缩的网络应用。 它采用事件驱动、非阻塞 I/O 模型&#xff0c;使其在处理并发请求时表现出色。 二、安装 Node.js 首先&#xff0c;让我们从 Node.…

【STM32】新建工程

学习来源&#xff1a;[2-2] 新建工程_哔哩哔哩_bilibili 目前STM32的开发主要有基于寄存器的开发方式、基于标准库也就是库函数的方式和基于HAL库的方式。本学习是基于库函数的方式。&#xff08;各种资料去百度云下载&#xff09; 1 建立工程文件夹 Keil中新建工程&#xf…

2824. 统计和小于目标的下标对数目 : 详解 “左找右“ “右找左“ 两种方式

题目描述 这是 LeetCode 上的 「2824. 统计和小于目标的下标对数目」 &#xff0c;难度为 「简单」。 Tag : 「排序」、「二分」、「双指针」 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target&#xff0c;请你返回满足 0 < i < j < n 且 nums[i] n…

ultralytics yolov8 实例分割 训练自有数据集

参考: https://docs.ultralytics.com/datasets/segment/coco/ http://www.bryh.cn/a/613333.html 1、数据下载与转换yolo格式 1)数据集下载: 参考:https://universe.roboflow.com/naumov-igor-segmentation/car-segmetarion 下载的是coco格式,需要转换 2)coco2yolo t…

C语言——指针(二)

&#x1f4dd;前言 上篇文章C语言——指针&#xff08;一&#xff09;初步讲解了&#xff1a; 1&#xff0c;指针与指针变量 2&#xff0c;指针变量的基本使用&#xff08;如何定义&#xff0c;初始化&#xff0c;引用&#xff09; 这篇文章我们进一步探讨&#xff0c;使用指针…

常见树种(贵州省):017柳树、喜树、珙桐、木棉、楝、枫杨、竹柏、百日青、翅荚香槐、皂荚、灯台树

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、柳树 …

idea自动切换输入法Smart Input

idea搜索后下载 红色表示中文输入法 再ideavim场景下会自动切换成英文非常好用强烈推荐下载一个

vue3(一)-基础入门

一、导入vue.js 1.可以借助 script 标签直接通过 CDN 来使用 Vue <!-- <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> -->2.也可以下载vue.global.js文件并在本地导入 <script src"./lib/vue.global.js">&…

Java中HashMap、Hashtable和ConcurrentHashMap的区别

介绍&#xff1a; 在Java编程中&#xff0c;HashMap、Hashtable和ConcurrentHashMap都是用于存储键值对的常见数据结构。尽管它们在表面上看起来很相似&#xff0c;但实际上它们之间存在一些重要的区别。本文将深入探讨HashMap、Hashtable和ConcurrentHashMap的区别&#xff0c…

代码随想录算法训练营第四十四天|57. 爬楼梯、322.零钱兑换、279. 完全平方数

KamaCoder 57. 爬楼梯 题目链接&#xff1a;题目页面 (kamacoder.com) 这道题使用完全背包来实现&#xff0c;我们首先考虑的是总的楼梯数&#xff0c;因此dp数组大小为n 1 &#xff0c;其意义是&#xff0c;在n阶时有多少种方法爬到楼顶&#xff0c;因此&#xff0c;当前n状…

电源控制系统架构(PCSA)之系统分区电压域

目录 4.1 电压域 4.1.1 系统逻辑 4.1.2 Always-On逻辑 4.1.3 处理器Clusters 4.1.4 图形处理器 4.1.5 其他功能 4.1.6 SoC分区示例 本章描述基于Arm组件的SoC划分为电压域和电源域。 所描述的选择并不详尽&#xff0c;只是可能性的一个子集。目的是描述基于Arm组件的SoC…

LV.12 D19 ADC实验 学习笔记

一、ADC简介 1.1 ADC ADC(Analog to Digital Converter)即模数转换器&#xff0c;指一个能将模拟信号转化为数字信号的电子元件 1.2 ADC主要参数 分辨率 ADC的分辨率一般以输出二进制数的位数来表示&#xff0c;当最大输入电压一定时&#xff0c;位数越高&#xff0c…