插入排序和希尔排序

目录

插入排序

         插入排序代码实现:

        插入排序思路:

        希尔排序:

       什么是希尔排序:

       希尔排序代码实现:

        希尔排序思路:


插入排序(稳定)

         假设有这样一个数组,想要从小到大进行排序:

int[] array = {4,9,5,8,6,2,10,7,3,1};

         插入排序代码实现:

public static void insertSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int ret = arr[i];int j = i - 1;for (; j >= 0 ; j--) {if(arr[j] > ret) {arr[j+1] = arr[j];}else {//arr[j+1] = ret;break;}}arr[j+1] = ret;}}

         代码运行结果:

        

        可以看到,结果是从小到大排序的。

        

        插入排序思路:

        

         假设有个待排序数组(黑色数字),定义一个 i 下标,一个 j 下标,再定义一个记录i下标的值的ret。

        首先,i 下标从 1 位置开始,j 下标在 i - 1位置开始,当 j 下标的值比 ret 的值大,把 j 下标的值给到 j+1 的位置。反之 把ret 的值给到 j+1的位置。以此往复。

        值得注意的是,比如数组的最小的元素(上图的是0), j 会到达下标为 -1 的位置,此时,循环里的  arr[j+1] = ret; 这句代码就执行不到了,意思就是数组最小元素 0 放不到下标为 0 的位置。所以在外面 加上一句 arr[j+1] = ret; 代码。这句代码和 循环里的这句代码重复了,就把 循环里的这句代码注释了。

        

 希尔排序(不稳定):

       什么是希尔排序:

          把待排序数据分成多个组,所有距离为的记录分在同⼀组内,并对每⼀组内的记录进行插入排序。然后,重复上述分组和排序的过程。当到达=1时,所有记录在统⼀组内排好序。

        什么意思呢?

        如图:

        

         先假定 gap的大小,这里初始的 gap 是5,让 每个数据之间都相差 距离为 gap 的大小,如果后面的最远的数据相差比 gap小就 不相连,这样就为一组了。下一个 组 从第二个数据开始,直到包含所有数据。分组就结束了。

        然后,对其中的一趟的 每一组进行插入排序,再不断缩小gap的大小,直到gap的大小为1,gap的大小为1就是一次完整的插入排序了。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

        所有,可以说希尔排序是对插入排序的优化。

         一样,我们假设有这样一个数组,想要从小到大进行排序:

 int[] array = {4,9,5,8,6,2,10,7,3,1};

       希尔排序代码实现:

 public static void shellSort(int[] arr) {int gap = arr.length / 2;while(gap > 0) {shell(arr,gap);gap /= 2;}}public static void shell(int[] arr,int gap) {for (int i = gap; i < arr.length; i++) {int ret = arr[i];int j = i - gap;for (; j >= 0 ; j -= gap) {if(arr[j] > ret) {arr[j+gap] = arr[j];}else {//arr[j+1] = ret;break;}}arr[j+gap] = ret;}}

        希尔排序思路:

        

         结合上图,这是 gap 为 2 的时候的情况,与插入排序类似,结合代码看,把红色组别看成一组数据,先让 下标 i 等于 gap的位置,j 在 i - gap 的位置,确保他们是在红色组别位置进行插入排序,下一次,i 加加,到了绿色组别位置,再让 j 在 i - gap 的位置,确保他们是在绿色组别位置进行插入排序。可以看出,他们是在红色和绿色组别交替进行插入排序的。

        直到 gap 为 1 ,就可以看作一次普通的插入排序了。

        

        至于起始的 gap 选多大是无法给出正确答案的,希尔排序时间复杂度不好计算,因为 gap 的取值很多,导致很难去计算。

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

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

相关文章

elasticsearch

1、什么是elasticsearch elasticsearch被广泛用于日志分析、实时监控领域 elastic stack &#xff08;ELK&#xff09; ①kibana 数据可视化 ②elasticsearch存储、计算、搜索数据 ③Longstash、Beats 数据抓取 操作ES的语句称之为DSL语句 2、ES倒排索引 3、ES单节点安装…

【AcWing】蓝桥杯辅导课-数学与简单DP

目录 数学 买不到的数目 蚂蚁感冒 饮料换购 DP 01背包问题 摘花生 最长上升子序列 地宫取宝 波动数列 数学 买不到的数目 1205. 买不到的数目 - AcWing题库 这道题的意思就是给定两个正整数p和q&#xff0c;求xpyq这一个组合不能凑出来的最大正整数是多少 首先我们…

PyQt学习记录01——加法计算器

0. 安装配置 0.1 安装相关库 首先打开你的PyCharm程序&#xff0c;然后新建一个目录用于学习&#xff0c;其次在terminal中输入 pip install pyqt5如果你不具有科学上网能力&#xff0c;请改为国内源 pip install pyqt5 -i https://pypi.douban.com/simple然后安装pyqt相关…

[Linux] 信号(singal)详解(二):信号管理的三张表、如何使用coredump文件、OS的用户态和内核态、如何理解系统调用?

标题&#xff1a;[Linux] 信号管理的三张表、如何使用coredump文件、OS的用户态和内核态、如何理解系统调用&#xff1f; 水墨不写bug &#xff08;图片来源&#xff1a;文心一言&#xff09; 正文开始&#xff1a; 目录 一、信号管理的三张表 &#xff08;1&#xff09;三张表…

2025.2.11

1> 制作一个闹钟软件 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QTime> #include <QTimer> #include <QTimeEdit> #include <QDa…

和鲸科技上线 DeepSeek 系列模型服务,助力数智企业 AI 业务创新!

近日&#xff0c;和鲸科技团队宣布旗下数据科学协同平台 ModelWhale 实现对 DeepSeek 全系列大模型的深度支持&#xff0c;旨在帮助更多数智化转型企业提供从算力基建到业务融合的全栈式解决方案&#xff0c;快速搭建自主可控的云端智能服务体系&#xff0c;实现大模型与业务系…

使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器进行模型检查点处理

2023 年 11 月&#xff0c;Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元&#xff08;数据集和数据加载器&#xff09;的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发(文末联系,整套资料提供)

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发 一、系统介绍 随着人们生活水平的提高和健康意识的增强&#xff0c;智能健康监测设备越来越受到关注。智能腰带作为一种新型的健康监测设备&#xff0c;能够实时采集用户的腰部健康数据&#xff0c;如姿势、运动…

【cocos creator】拖拽排序列表

DEMO下载 GameCtrl.ts import ItemCtrl from "./ItemCtrl";const { ccclass, property } cc._decorator;ccclass export default class GameCtrl extends cc.Component {property(cc.Node)content: cc.Node null;property(cc.Node)prefab: cc.Node null;arr []…

Vision Transformer:打破CNN垄断,全局注意力机制重塑计算机视觉范式

目录 引言 一、ViT模型的起源和历史 二、什么是ViT&#xff1f; 图像处理流程 图像切分 展平与线性映射 位置编码 Transformer编码器 分类头&#xff08;Classification Head&#xff09; 自注意力机制 注意力图 三、Coovally AI模型训练与应用平台 四、ViT与图像…

国产编辑器EverEdit - 编辑辅助功能介绍

1 编辑辅助功能 1.1 各编辑辅助选项说明 1.1.1 行号 打开该选项时&#xff0c;在编辑器主窗口左侧显示行号&#xff0c;如下图所示&#xff1a; 1.1.2 文档地图 打开该选项时&#xff0c;在编辑器主窗口右侧靠近垂直滚动条的地方显示代码的缩略图&#xff0c;如下图所示&…

Spring AI 介绍

文章来源&#xff1a;AI 概念 (AI Concepts) _ Spring AI1.0.0-SNAPSHOT中文文档(官方文档中文翻译)|Spring 教程 —— CADN开发者文档中心 本节介绍 Spring AI 使用的核心概念。我们建议仔细阅读它&#xff0c;以了解 Spring AI 是如何实现的。 模型 AI 模型是旨在处理和生成…

Spring MVC 拦截器(Interceptor)与过滤器(Filter)的区别?

1、两者概述 拦截器&#xff08;Interceptor&#xff09;&#xff1a; 只会拦截那些被 Controller 或 RestController 标注的类中的方法处理的请求&#xff0c;也就是那些由 Spring MVC 调度的请求。过滤器&#xff08;Filter&#xff09;&#xff1a; 会拦截所有类型的 HTTP …

qt QCommandLineOption 详解

1、概述 QCommandLineOption类是Qt框架中用于解析命令行参数的类。它提供了一种方便的方式来定义和解析命令行选项&#xff0c;并且可以与QCommandLineParser类一起使用&#xff0c;以便在应用程序中轻松处理命令行参数。通过QCommandLineOption类&#xff0c;开发者可以更便捷…

Flink KafkaConsumer offset是如何提交的

一、fllink 内部配置 client.id.prefix&#xff0c;指定用于 Kafka Consumer 的客户端 ID 前缀partition.discovery.interval.ms&#xff0c;定义 Kafka Source 检查新分区的时间间隔。 请参阅下面的动态分区检查一节register.consumer.metrics 指定是否在 Flink 中注册 Kafka…

从Word里面用VBA调用NVIDIA的免费DeepSeekR1

看上去能用而已。 选中的文字作为输入&#xff0c;运行对应的宏即可&#xff1b;会先MSGBOX提示一下&#xff0c;然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…

网络工程师 (29)CSMA/CD协议

前言 CSMA/CD协议&#xff0c;即载波监听多路访问/碰撞检测&#xff08;Carrier Sense Multiple Access with Collision Detection&#xff09;协议&#xff0c;是一种在计算机网络中&#xff0c;特别是在以太网环境下&#xff0c;用于管理多个设备共享同一物理传输介质的重要…

WPS中如何批量上下居中对齐word表格中的所有文字

大家好&#xff0c;我是小鱼。 在日常制作Word表格时&#xff0c;经常需要对表格中的内容进行排版。经常会把文字设置成左对齐、居中对齐或者是右对齐&#xff0c;这些对齐方式都比较好设置&#xff0c;有时制作的表格需要把文字批量上下居中对齐&#xff0c;轻松几步就可以搞…

GeekPad智慧屏编程控制

前面通过homeassistant和emqx一番折腾&#xff0c;已经可以控制GeekPad智慧屏的开关了。但是这中间用到的软件对环境依赖非常高&#xff0c;想再优化一下&#xff0c;把这两个工具都装到手机上&#xff0c;最后勉强实现了&#xff0c;但是还得借用模拟器和容器&#xff0c;稳定…

【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能&#xff08;AI&#xff09;通过算法模拟人类智能&#xff0c;利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络&#xff08;如ChatGPT&…