目录

  • 插入排序
    • 例子
    • 时间复杂度
    • java代码
  • 希尔排序(缩小增量排序)
    • 例子
    • 时间复杂度
    • java代码

相关文章

  • 学习数据结构理论+算法时间复杂度
  • 学习有序二叉树+平衡二叉树+红黑树
  • 学习冒泡排序+选择排序并使用java写代码
  • 学习插入排序+希尔排序并使用java写代码
  • 学习堆排序+基数排序并使用java写代码
  • 学习递归+归并排序+快速排序并使用java写代码

插入排序:

  1. 认为数组当中的第一个数值是已经排好序的数值;
  2. 定义一个游标,从第二个数值开始不断地向后进行遍历;
  3. 游标指向的数值插入到已经拍好序的数组当中。

例子:

  1. 定义一个游标 i ,从第一个开始遍历;
  2. 定义一个游标 j ,指向 i 的前一个数值;
  3. 对应的 j+1 指向要插入的数值;
  4. j 应当要比 j+1 小,如果 j > j+1 ,交换位置。

待排序组:5、7、4、1、3、0、2、6,用插入排序进行排序,步骤如下:
插入排序开始

  • j 指向5,j+1 指向7,5<7,不动;
    5、7
  • 继续,i, j,j+1 后移,
    • j 指向7,j+1 指向4,7>4,交换位置;
    • j 指向5,j+1 指向4,5>4,交换位置;
      7、4换位置
      5、4换位置
  • 继续,i, j,j+1 后移,
    • j 指向7,j+1 指向1,7>2,交换位置;
    • j 指向5,j+1 指向1,5>1,交换位置;
    • j 指向4,j+1 指向1,4>1,交换位置;
      7、1换位置
      5、1换位置
      4、1换位置
  • 继续,i, j,j+1 后移,
    • j 指向7,j+1 指向3,7>3,交换位置;
    • j 指向5,j+1 指向3,5>3,交换位置;
    • j 指向4,j+1 指向3,4>3,交换位置;
    • j 指向1,j+1 指向3,1<3,不动;
      连续换位置
  • ……
  • 这样一直交换插入,直到插入排序完成。
    插入排序完成

时间复杂度:

数据(默认从第二个数据开始)移动次数(理想情况没有中断)
下标是1的数据1
下标是2的数据2
下标是3的数据3
下表是4的数据4
…………
下标的x-1的数据x-1

等差数列求和公式:y=(1+x−1)(x−1)2y=\frac{(1+x-1)(x-1)}{2}y=2(1+x1)(x1)
得到时间复杂度是:O(n2)O(n^2)O(n2)
缺点: 越小的数值在后面移动的次数越多

java代码:

package com.xxx;import java.util.Arrays;//插入排序
public class InsertSort {public static void main(String[] args) {int[] arr = {5,7,4,1,3,0,2,6};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr) {for(int i=1;i<arr.length;i++) {//i指向的数据插入到前边已经拍好的数组当中for(int j=i-1;j>=0;j--) {//j 和 j+1 指向的数据进行比较,交换if(arr[j]>arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}else {break;}}}}
}

插入:
定义游标j指向i的前一个数据,j和j+1指向的数据进行交换,若j+1的值小,则j和j+1指向的值进行交换,j–;继续比较,知道j+1的值大,或着j=0停止。

希尔排序(缩小增量排序):

  1. 将数组按照数组长度的一半为间隔(步长)进行分组(奇偶无所谓,第一组为3个,剩下的均是两两一组),组内进行插入排序
  2. 将数组按照数组长度的一半的一半为间隔进行分组,组内进行插入排序,多个分组来回交替插入排序;
  3. 将数组按照数组长度的一半的一半的一半为间隔进行分组,组内进行插入排序;
  4. ……
  5. 直到步长为1,整个数组作为一组,进行插入配许,结束。

例子:

待排序组:5、7、4、1、3、0、2、6,用希尔排序进行排序,步骤如下:

  1. 先分组:8个数值,8/2=4,每隔四个为一组;
    分组
  2. 组内比较,排序:
    • 5、0比较,交换位置;
    • 7、3比较,交换位置;
    • 4、1比较,交换位置;
    • 2、6比较,位置不动;
      组内比较
  3. 在分一半,步长为2;
    二次分组
  4. 组内比较,排序(分组来回交替排序插入):
    • 0、1比较,位置不动;
    • 3、2比较,交换位置;
    • 1、5比较,位置不动;
    • 2、7比较,位置不动;
    • 5、4比较,交换位置;
    • 7、6比较,交换位置;
      组内再次比较
  5. 在分一半,步长为1,整个数组为一组;
    三次分组
  6. 比较排序,直到结束,希尔排序完成。
    希尔排序完成

时间复杂度:

轮数间隔交换次数
第一轮x/2=x/21x/2=x/2^1x/2=x/21x/2x/2x/2
第二轮x/2/2=x/22x/2/2=x/2^2x/2/2=x/22x/2x/2x/2 ~ x−1x-1x1
第三轮x/2/2/2=x/23x/2/2/2=x/2^3x/2/2/2=x/23x/2x/2x/2 ~ x−1x-1x1
第四轮x/2/2/2/2=x/24x/2/2/2/2=x/2^4x/2/2/2/2=x/24x/2x/2x/2 ~ x−1x-1x1
………………
第k轮1=x/2k1=x/2^k1=x/2kx−1x-1x1

得到关系式:1=x/2k1=x/2^k1=x/2k
转换:x=2kx=2^kx=2k
得到一个轮次的k与x的关系式是:k=logxk=logxk=logx
所有的轮次相加是:k=xlogxk=xlogxk=xlogx
得到时间复杂度是:O(nlogn)O(nlogn)O(nlogn)

java代码:

package com.xxx;import java.util.Arrays;//希尔排序
public class ShellSort {public static void main(String[] args) {int[] arr = {17,7,24,33,28,19,15,30};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr) {//定义步长变量 grpfor(int grp=arr.length/2;grp>=1;grp=grp/2) {//定义游标 i,控制 i 的移动,组内进行插入排序for(int i=grp;i<arr.length;i++) {//结束 j 和 j+grp 完成组内的插入for(int j=i-grp;j>=0;j=j-grp) {// j 和 j+grp 指向的数据进行比较,交换if(arr[j]>arr[j+grp]) {int temp = arr[j];arr[j] = arr[j+grp];arr[j+grp] = temp;}else {break;}}}}}
}

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

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

相关文章

win10虚拟机报错打不开和ubuntu空间不足

ubuntu主机安装的win10虚拟机报错如下&#xff0c;导致虚拟机无法打开解决办法 如上图&#xff0c;找到ubuntu主机home目录中win10的路径&#xff0c;将红色框的文件删除&#xff0c;然后将绿色框中的文件.prev后缀去掉&#xff0c;如下图所示。重新打开虚拟机就可以了 ubuntu空…

指纹手机技术:破解亚马逊多账号运营痛点的底层逻辑与实践

在亚马逊平台运营中&#xff0c;账号关联、行为异常、网络不合规是卖家绕不开的三大核心风险。随着亚马逊反作弊系统&#xff08;如 A9 算法&#xff09;对设备指纹、操作轨迹、网络特征的识别精度持续提升&#xff0c;传统 “普通手机 VPN” 的多账号运营模式已频繁触发风控&…

《UE5_C++多人TPS完整教程》学习笔记46 ——《P47 蹲伏行走(Crouching Walking)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P47 蹲伏行走&#xff08;Crouching Walking&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; S…

TiDB v8.5.3 单机集群部署指南

前言 最近在做 TiDB 的恢复演练&#xff0c;需要在单台 Linux 服务器上部署一套 TiDB 最小的完整拓扑的集群&#xff0c;本文记录一下安装过程。 环境准备 开始部署 TiDB 集群前&#xff0c;准备一台部署主机&#xff0c;确保其软件满足需求&#xff1a; 推荐安装 CentOS 7…

ClickHouse常见问题——ClickHouseKeeper配置listen_host后不生效

ClickHouseKeeper配置listen_host后不生效ClickHouseKeeper配置listen_host后不生效ClickHouseKeeper配置listen_host后不生效 3节点部署ClickHouse集群后&#xff0c;ClickHouse Server执行报错&#xff1a; Poco::Exception. Code: 1000, e.code() 111, Connection refuse…

《Python × MongoDB 实战指南:从连接到查询,构建高效数据操作流程》

《Python MongoDB 实战指南:从连接到查询,构建高效数据操作流程》 一、引言:当 Python 遇上 MongoDB 在当今数据驱动的开发世界里,MongoDB 以其灵活的文档结构、强大的查询能力和良好的扩展性,成为 NoSQL 数据库中的佼佼者。而 Python,作为一门简洁优雅、生态丰富的编…

【Flask + Vue3 前后端分离管理系统】

Flask Vue3 前后端分离管理系统 项目概述 本项目是一个基于 Flask 后端和 Vue3 前端的前后端分离管理系统。项目实现了用户管理、角色管理、菜单管理、权限控制等完整的后台管理功能。 技术栈 后端技术栈&#xff1a; Flask 3.0.0 - Python Web框架Flask-SQLAlchemy 3.1.1 - O…

51c视觉~3D~合集5

自己的原文哦~ https://blog.51cto.com/whaosoft/14165531 #AnimateAnyMesh 文本驱动通用网格动画新范式&#xff0c;实现高效高质量4D内容生成 4D 内容生成&#xff0c;即包含时间维度信息的 3D 内容创建&#xff0c;在 VR/AR、游戏等领域具有广阔的应用前景。…

开悟篇Docker从零到实战一篇文章搞定

目录 一:概述 1:why docker 2:Docker是什么? 3:Docker核心概念 二:初步体验 1:Docker核心架构图 2:准备工作 1:服务器 2:Docker安装 3:阿里云docker安装 4:镜像加速 三:Docker命令和帮助文档的使用 1:帮助文档 2:镜像的基本操作 1:查看本地…

LINUX驱动篇(二)驱动开发

系列文章目录 文章目录系列文章目录总结介绍字符设备驱动工作原理驱动框架加载卸载注册注销设备号详解打开关闭等操作实例分析led驱动编写地址映射LED驱动改进驱动方式总结自动注册注销设备号自动创建设备节点设备树设备树LED驱动实验pinctrl和gpio并发和竞争原子操作自旋锁块设…

【工具】开源大屏设计器 自用整理

【工具】开源大屏设计器 自用整理 GoView低代码数据可视化 GoView 说明文档 | 低代码数据可视化开发平台 JimuReport积木报表(免费报表工具) https://github.com/jeecgboot/JimuReport 「数据可视化&#xff1a;报表、大屏、数据看板」积木报表是一款类Excel操作风格&#xf…

.NetCore MVC

这个是我自己记得笔记&#xff0c;最好有点基础看我的。 html 辅助标签 Html.DropList 分布视图 使用 RenderPartialAsync 呈现分部视图。 此方法不返回 IHtmlContent。 它将呈现的输出直接流式传输到响应。 因为该方法不返回结果&#xff0c;所以必须在 Razor 代码块内调用它…

@GitLab 介绍部署使用详细指南

文章目录**GitLab 介绍&部署&使用详细指南****1. GitLab 介绍与核心概念****1.1 什么是 GitLab&#xff1f;****1.2 核心特性****1.3 版本区别****2. 部署指南 (以 Ubuntu 22.04 LTS 为例)****2.1 环境准备****2.2 安装步骤****2.3 重要配置文件****3. 基本使用入门***…

如何通过 AI IDE 集成开发工具快速生成简易留言板系统

在当今快速迭代的软件开发环境中&#xff0c;AI 辅助编程工具已经成为开发者提高效率的重要手段。本文将详细介绍如何利用 AI IDE 集成开发工具快速构建一个功能完整的简易留言板系统&#xff0c;涵盖从需求分析到部署上线的全过程&#xff0c;并提供完整代码、流程图、Prompt …

机器学习:从技术原理到实践应用的深度解析

目录引言一.什么是机器学习&#xff08;ML&#xff09;&#xff1f;——从技术本质到核心目标1.与传统编程的本质区别&#xff1a;规则的“来源不同”2.核心目标&#xff1a;在“偏差-方差权衡”下优化性能指标二.机器学习的核心分类——基于“数据标签”与“学习范式”的技术划…

[muduo网络库]-muduo库TcpServer类解析

本贴用于记录muduo库的学习过程&#xff0c;以下是关于TcpServer的个人理解。 TcpServer内含Acceptor、threadpool等类&#xff0c;算是把主线程所有要做的事封装了起来。 重要成员变量 EventLoop *loop_; // baseloop 用户自定义的loopconst std::string ipPort_;const std…

工作两年,最后从css转向tailwind了!

菜鸟上班已经两年了&#xff0c;从一个对技术充满热情的小伙子&#xff0c;变成了一个职场老鸟了。自以为自己在不停的学习&#xff0c;但是其实就是学一些零碎的知识点&#xff0c;比如&#xff1a;vue中什么东西没见过、js什么特性没用过、css新出了个啥 …… 菜鸟感觉自己也…

macOS 更新后找不到钥匙串访问工具的解决方案

macOS 更新后找不到钥匙串访问工具的解决方案 随着macOS的不断更新&#xff0c;一些系统工具的位置可能会发生变化&#xff0c;给用户带来不便。钥匙串访问&#xff08;Keychain Access&#xff09;是macOS中一个非常重要的工具&#xff0c;用于管理密码、证书等敏感信息。最近…

深入理解Go 与 PHP 在参数传递上的核心区别

$run_return_data []; $ret $this->handleData($event_req_info, $run_return_data); public function handleData($event_req_info, &$run_return_data): array {$run_return_data [ //使用引用变量返回数据shop_id > $shop_id,request_id > $request_…

【Dify智能体】2025 最新版Linux部署Dify教程(Ubuntu)

一、前言 Dify 是一款开源的智能体工作流平台,可以用来快速构建 AI 应用。相比手动搭建复杂的依赖环境,Docker Compose 部署方式更简单、更快速、更稳定。本文将一步步带你在 Ubuntu 22.04 + Docker Compose v2 上安装 Dify,并给出常见问题与优化方案。 ps:如果还没有安装…