七大排序算法——希尔排序,通俗易懂的思路讲解与图解(完整Java代码)

news2025/1/10 2:55:26

文章目录

  • 一、排序的概念
    • 排序的概念
    • 排序的稳定性
    • 七大排序算法
  • 二、希尔排序
    • 核心思想
    • 代码实现
  • 三、性能分析
  • 四、七大排序算法性能对比


一、排序的概念

排序的概念

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

排序的稳定性

在这里插入图片描述
上述待排序的数中,有两个5。 将前面的5标记一个a, 将后面的5标记一个b。

通过算法进行排序后,这一组数就有序了, 但是要看两个相同的5的位置是否有改变。
5a仍在5b前面,那么这个排序算法就是稳定的
5a跑到了5b后面,那么这个排序算法就是不稳定的

一个稳定的排序算法可以做到不稳定,
不稳定的排序算法一定做不到稳定。


至于为什么要讨论这个稳定性, 是为了以后应用到实际场景上。 比如,一场数学考试, 假设a用了30分钟做完了,并得了满分。
假设b用了一个小时做完了,并得了满分。 此时a与b都是得了满分,但是用的时间不一样,所以两个人的排名又会有所不同。


七大排序算法

在这里插入图片描述


二、希尔排序

核心思想

基本思想希尔排序法又称缩小增量法。希尔排序法的基本思想是:

先选定一个整数,把待排序文件中所有记录分成多个组。
所有距离为的记录分在同一组内,并对每一组内的记录进行直接插入排序。
然后,取,重复上述分组和排序的工作。
当到达=1时,所有记录在统一组内排好序。


图解

有一组待排序数列,我们进行升序排序。在这里插入图片描述
排序过程:在这里插入图片描述
说白了就是,将这些数分为几个组,这几个组再分别直接插入排序,然后分的组数减少,重复上述过程,直到只剩1组时,再对这个组排序,就完成了排序。

组数多则每组的数据少,组数少则每组的数据多。


代码实现

代码实现

public class ShellSort {
    /**
     * 希尔排序
     * 时间复杂度:O(n^1.3) - O(n^1.5)
     * 空间复杂度:O(1)
     * 稳定性:不稳定
     * @param array
     */
    public static void shell(int[] array) {
        // 组数
        int gap = array.length;
        while (gap > 1) {
            // gap组数变换比较随意,
            // gap /= 3;也可以
            gap /= 2;
            shell(array,gap);
        }
        // 最后让组数为1再排序一次
        shell(array,1);
    }
    public static void shell(int[] array,int gap) {
        for (int i = gap; i < array.length; i++) {
            // 默认每组内第一个数据都是有序的,
            // 从每组的第二个数据开始进行直接插入排序
            // i++即是跳到下一组,
            // 每组排序一个数,然后跳到下一组,如此循环。
            int tmp = array[i];
            int j = i - gap;
            
            // 跳跃式的组内直接插入排序
            for (; j >= 0 ; j-=gap) {
                if(array[j] > tmp) {
                    array[j+gap] = array[j];
                } else {
                    break;
                }
            }
            array[j + gap] = tmp;
        }
    }
}

三、性能分析

希尔排序的特性总结:
希尔排序是对直接插入排序的优化。直接插入排序的特定就是数据越有序,速度越快。

当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。


时间复杂度:
希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定: 有学者通过大量的试验统计,得出结果为:O(n1.25) - O(1.6*n1.25)


空间复杂度:O(1)

稳定性:
不相邻的元素也会进行位置交换,是不稳定。


四、七大排序算法性能对比

在这里插入图片描述

想学哪个点哪个
归并排序讲解
快速排序讲解
直接插入排序讲解
希尔排序讲解
直接选择排序讲解
堆排序讲解
冒泡排序讲解

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

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

相关文章

自动化测试与持续集成方案

目录 前言&#xff1a; 传统接口测试 接口测试自动化 接口自动化的持续集成 前言&#xff1a; 自动化测试和持续集成是软件开发过程中非常重要的环节。自动化测试可以提高测试效率和准确性&#xff0c;而持续集成则可以确保代码的稳定性和可靠性。 传统接口测试 不知道别…

使用WiFi测量仪进行机器人定位的粒子过滤器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

50. Pow(x, n) 快速幂

题目链接&#xff1a;力扣 解题思路&#xff1a;直接使用for进行累乘会超时&#xff08;时间复杂度O(n)&#xff0c;n为指数n的大小&#xff09;&#xff0c;可以使用快速幂进行更快的幂运算(时间复杂度为O(logn)) 快速幂&#xff1a;核心思想就是每一次把指数缩小一半&#x…

华南农业大学|图像处理与分析技术综合设计|题目解答:读取电表示数

l 设计任务&#xff1a; ipa05.jpg是一幅电气柜上的电表图像&#xff0c;试采用图像处理与分析技术&#xff0c;设计适当的 算法和程序&#xff0c;找出电流表所在的区域&#xff0c;提取其指针位置&#xff0c;计算指针与表盘下沿 的夹角&#xff0c;进而判断当前电表的读数…

车载软件架构——车载诊断软件框架

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑&#xff1a;你的价值、你的能力、你的…

vue2+AntdesignVue a-input使用颜色选择器

不需要任何插件即可实现颜色选择器 a-input type设置为color即可 回调函数

vue进阶-消息的订阅与发布

&#x1f4d6;vue基础学习-组件 介绍了嵌套组件间父子组件通过 props 属性进行传参。子组件传递数据给父组件通过 $emit() 返回自定义事件&#xff0c;父组件调用自定义事件接收子组件返回参数。 &#x1f4d6;vue进阶-vue-route 介绍了路由组件传参&#xff0c;两种方式&…

Spring MVC异步上传、跨服务器上传和文件下载

一、异步上传 之前的上传方案&#xff0c;在上传成功后都会跳转页面。而在实际开发中&#xff0c;很多情况下上传后不进行跳转&#xff0c;而是进行页面的局部刷新&#xff0c;比如&#xff1a;上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。 1.1 JSP页面 …

PT:report_timing实用技巧

report_timing -start_end_pair 默认report_timing -to 会报告到endpoint最差一条violation path。 用report_timing -max_path X就会报告到endpoint的X条path&#xff0c;每组startpoint /endpoint只报告最差的一条(在X范围内有多少报多少&#xff0c;下面同理)。 用report…

Android 生成pdf文件

Android 生成pdf文件 1.使用官方的方式 使用官方的方式也就是PdfDocument类的使用 1.1 基本使用 /**** 将tv内容写入到pdf文件*/RequiresApi(api Build.VERSION_CODES.KITKAT)private void newPdf() {// 创建一个PDF文本对象PdfDocument document new PdfDocument();//创建…

什么是从人类反馈中强化学习(RLHF)?

自从OpenAI公司发布ChatGPT以来&#xff0c;人们对大型语言模型(LLM)的这一重大进步感到兴奋。虽然ChatGPT与其他最先进的大型语言模型大小相同&#xff0c;但其性能要高得多&#xff0c;并且承诺支持新的应用程序或颠覆取代原有的应用程序。 ChatGPT的惊人表现背后的主要原因…

NAT—网络地址转换

目录 静态NAT 动态NAT NAPT—easy IP 多对多的NAPT 端口映射—高级用法 NAT—网络地址转换 IPV4地址不够用 NAT ABC—三类地址中截取了一部分地址&#xff08;并且让这部分地址可以重复使用&#xff09;—私网地址 A类地址中&#xff1a;10.0.0.0-10.255.255.255 &#xff08;…

3. 学习分类 - 基于图像大小进行分类

3.1 设置问题 根据图片的尺寸&#xff0c;把图片分为纵向图像和横向图像。这种把图像分成两种类别的问题&#xff0c;就是二分类问题。 纵向图片示例&#xff1a; 横向图片示例&#xff1a; 这样就有了两个训练数据&#xff1a; 增加训练数据&#xff0c;并在图像中表示出来…

mac批量修改文件名为不同名字

mac批量修改文件名为不同名字怎么弄&#xff1f;很多小伙伴通过私信向我求助&#xff0c;用什么方法可以在mac电脑上批量修改文件名称&#xff0c;将大量文件修改成不同的名称。这可能是一项比较麻烦的操作&#xff0c;在电脑上进行过批量重命名的小伙伴都知道&#xff0c;一般…

汉服小姐姐【InsCode Stable Diffusion美图活动一期】

一、 Stable Diffusion 模型在线使用地址&#xff1a;https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型版本及相关配置&#xff1a; 模型&#xff1a;majicmixRealistic_v6 Lora&#xff1a;hanfu_ming 采样迭代步数&#xff08;steps&#xff09;: 40 采样方法&am…

SCB后备保护器——保护电器的后备力量

在现代社会中&#xff0c;电力设备已经成为了不可或缺的一部分&#xff0c;而在使用电力设备的过程中&#xff0c;由于各种原因&#xff0c;电力设备可能会受到电涌的影响&#xff0c;从而导致设备损坏或者火灾事故的发生。为了有效保护电力设备的安全稳定运行&#xff0c;研发…

数据科学分析全流程步骤

知识图谱以结构化的“知识”来存储与表示海量数据&#xff0c;作为承载底层海量知识并支持上层智能应用的重要载体&#xff0c;它在智能时代中扮演了极其重要的角色。然而&#xff0c;由于知识图谱高度结构化的特点&#xff0c;我们常常需要构建结构化查询语句&#xff08;SPAR…

卷积神经网络(CNN)原理详解

近些年人工智能发展迅速&#xff0c;在图像识别、语音识别、物体识别等各种场景上深度学习取得了巨大的成功&#xff0c;例如AlphaGo击败世界围棋冠军&#xff0c;iPhone X内置了人脸识别解锁功能等等&#xff0c;很多AI产品在世界上引起了很大的轰动。 而其中 卷积神经网络&am…

微服务 云原生:gRPC 客户端、服务端的通信原理

gRPC Hello World protoc 是 Protobuf 的核心工具&#xff0c;用于编写 .proto 文件并生成 protobuf 代码。在这里&#xff0c;以 Go 语言代码为例&#xff0c;进行 gRPC 相关代码编写。 下载 protoc 工具&#xff1a;https://github.com/protocolbuffers/protobuf/releases&a…

饭堂人群密度检测之Pythton

完整资料进入【数字空间】查看——baidu搜索"writebug" 一、饭堂人群密度检测 二、选题背景 在这个人工智能快速发展的时代&#xff0c;智能交通、智能机器人等人工智能化产品不断出现。作为人工智能的重要分支&#xff0c;计算机视觉起到了重要作用。它通过一系列的…