【数据结构】关于冒泡排序,选择排序,插入排序,希尔排序,堆排序你到底了解多少???(超详解)

news2024/12/23 6:16:51

前言:

🌟🌟Hello家人们,这期讲解排序算法的原理,希望你能帮到屏幕前的你。

🌈上期博客在这里:http://t.csdnimg.cn/I1Ssq

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

目录

📚️1.排序的概念和运用 

1.1排序的概念

1.2排序的运用

1.3常见的排序算法

 📚️2.常见排序算法的实现

2.1插入排序

2.2希尔排序 

2.3选择排序

2.4冒泡排序 

2.5堆排序 

📚️3.排序总结


📚️1.排序的概念和运用 

1.1排序的概念

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

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

对于稳定性举例: 假如两个人考了一样的分数,那么先交卷的同学成绩因该排在后交卷的同学的前面,这样才符合常理逻辑。

内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

1.2排序的运用

例如:在通常我们在购物时,总会在界面顶部看到按照价格由低到高,或者由高到低,还有我们平时经常关注的中国大学实力排名等等,又要运用到排序,甚至当我们大打克牌的时候对其进行从小到大的排序,由此可见排序在日常生活中无处不在。

1.3常见的排序算法

这里小编将讲解前五个排序。 

 📚️2.常见排序算法的实现

2.1插入排序

1.插入排序思想:

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。实际中我们玩扑克牌时,就用了插入排序的想。

2.图解:

3.代码实现:

public static void InsertSort(int array[]){
        int temp=0;
        int i;
        int j;
        for (j = 1; j < array.length; j++) {
            temp=array[j];
            //此时进行大小判断
            for ( i = j-1; i >=0 ; i--) {
                if(temp<array[i]){
                    //赋值
                    array[i+1]=array[i];
                }else {
                    break;
                }
            }
            array[i+1]=temp;
        }
    }

这里小编设置了temp表示存储空间,i的值开始都为j-1然后每次递减,与对应的数字进行比较,然后发现对应的位置就将存储的数值,插入其中,j++直到队尾。

 4.插入排序总结

1. 元素集合越接近有序,直接插入排序算法的时间效率越高


2. 时间复杂度:

最坏情况:O(N^2)   (5    4    3    2    1)完全逆序

最好情况:O(N)       (1    2    3    4    5)完全顺序


3. 空间复杂度:O(1),它是一种稳定的排序算法


4. 稳定性:稳定

2.2希尔排序 

1.希尔排序法的思想:

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

2.图解:

其实就是进行分组,然后每组进行插入排序即可,因为最后的分组为1,然而此时的数据已经接近一个有序的排列,所以减少了排序时间。

3.代码实现:

public static void ShellSort(int[] array){
        int gap= array.length;
        while (gap>=1){
            gap/=2;
            Shell(array,gap);
        }
    }
    public static void Shell(int[] array,int gap){
        int temp=0;
        int i;
        int j;
        for (j = gap; j < array.length; j++) {
            temp=array[j];
            //此时进行大小判断
            for ( i = j-gap; i >=0 ; i=i-gap) {
                if(temp<array[i]){
                    //赋值
                    array[i+gap]=array[i];
                }else {
                    break;
                }
            }
            array[i+gap]=temp;
        }
    }

小编在这里设置了两个方法,一个负责进行分组,小编就不在过多赘述,对于另一个方法,这里j的开始为gap是应为分组为gap组,然后每组的第二个元素就为gap下标,i也要减去gap,大家看可以照图来看。

4.希尔排序的总结:

1. 希尔排序是对直接插入排序的优化。


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


3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定

4.希尔排序是不稳定的排序

2.3选择排序

1.选择排序基本思想:

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

2.图解:

3.代码实现:

public static void SelectSort(int[] array){
        for (int k = 0; k < array.length-1; k++) {
            int minIndex=k;
            for (int j = k+1; j < array.length ; j++) {
                if(array[j]<array[minIndex]){
                     minIndex=j;
                }
            }
            int temp=array[k];
            array[k]=array[minIndex];
            array[minIndex]=temp;
        }
    }

注意:每次更新时,minindex下标也要跟着进行更新。

4.选择排序总结:

1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用


2. 时间复杂度:O(N^2)(不管排序情况咋样)


3. 空间复杂度:O(1)


4. 稳定性:不稳定

2.4冒泡排序 

1.冒泡排序思路:

基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,在冒泡排序中通过相邻两个数字的比较,若前面的更小,那么将两者进行交换,然后下标往后移。

2.图解:

3.代码实现:

 public static void BubbleSort(int[] array){

        for (int i = 0; i <array.length-1 ; i++) {
            boolean bool=false;
            for (int j = 0; j < array.length-1-i; j++) {
                if(array[j]>array[j+1]){
                    swap(j,j+1,array);
                    bool=true;
                }
            }
            if(bool==false){
                return;
            }
        }
    }

 注意:这里设置了布尔类型,若没有进行交换,则表示这组数据已经有序了,那么此时bool为true,在一次操作后进行判断,为true就直接跳出循环,反之继续进行下一次循环。即对冒泡排序的优化。

4.冒泡排序总结: 

1. 冒泡排序是一种非常容易理解的排序
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:稳定

2.5堆排序 

1.堆排序思路:

堆排序(Heapsort) 是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆 来进行选择数据需要注意的是排升序要建大堆,排降序建小堆。

2.图解: 

在这里主要是,先将所给的数据建成一个大根堆,因为堆顶元素肯定是最大的,然后进行与末尾元素进行交换,然后忽视队尾最大元素,再次进行一次向下调整为大根堆,然后又进行与队尾元素交换。

3.代码实现:

public static void HeapSort(int[] array){
        createBigheap(array);
        for (int i = array.length-1; i >0 ; i--) {
            swap(0, i,array);
            shiftdown(0,array,i-1);
        }
    }
    //创建一个大根堆
    public static void createBigheap(int[] array){
        for (int parent = (array.length-2)/2; parent >=0 ; parent--) {
            shiftdown(parent,array, array.length-1);
        }
    }
    //向下调整
    public static void shiftdown(int parent,int[] array,int end){
        int child=parent*2+1;
        while (child< end){
            if(array[child]<array[child+1]&&(child+1)<=end){
                child++;
            }
            if(array[parent]<array[child]){
                int temp=array[parent];
                array[parent]=array[child];
                array[child]=temp;
            }
            parent=child;
            child=parent*2+1;
        }
    }

这里的向下调整和创建一个大根堆,小编在上一期已经讲解过了,就不再过多赘述。

注意:这里主要是在调用传参的时候,因为要忽略交换后队尾最大元素,所以每次进行向下调整后都要进行边界的调整。

4.堆排序总结:

1. 堆排序使用堆来选数,效率就高了很多。
2. 时间复杂度:O(N*logN)
3. 空间复杂度:O(1)
4. 稳定性:不稳定

📚️3.排序总结

💬💬小编这期主要讲述了对于七大排序的前五个,通过讲解思路,以及画图的方式进行思路分析,以及代码的实现。

对于排序算法来说,主要是抓住每种排序的思想,以及排序的方式,这里可以推荐通过画图的方式进行分析,效果事半功倍~~~

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


                                💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                                                         😊😊  期待你的关注~~~ 

 

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

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

相关文章

RK3568平台开发系列讲解(PWM篇)PWM的使用

文章目录 一、什么是PWM二、RK3568 PWM2.1、PWM 通道与引脚2.2、PWM 简介2.3、PWM 设备节点三、RK3568 PWM 调试节点📢 PWM 是很常用到功能,我们可以通过 PWM 来控制电机速度,也可以使用 PWM 来控制 LCD 的背光亮度。 一、什么是PWM PWM 全称是 Pulse Width Modulation,也…

XSS- - - DOM 破坏案例与靶场

目录 链接靶场&#xff1a; 第一关 Ma Spaghet 第二关 Jefff 第三关 Ugandan Knuckles 第四关 Ricardo Milos 第五关 Ah Thats Hawt 第六关 Ligma 第七关 Mafia 第八关 Ok, Boomer 链接靶场&#xff1a; XS…

SmartEDA崛起!揭秘其逐步取代Multisim与Proteus的四大颠覆性优势

在电子设计自动化&#xff08;EDA&#xff09;的浩瀚星空中&#xff0c;两款老牌软件——Multisim与Proteus&#xff0c;长久以来如同璀璨的双星&#xff0c;引领着电路仿真与设计的潮流。然而&#xff0c;近年来&#xff0c;一颗新星悄然升起&#xff0c;以其独特的魅力与强大…

《向量数据库 Faiss 搭建与使用全攻略》

一、Faiss 概述 Faiss 是由 Facebook AI 团队开发的一款强大工具&#xff0c;在大规模数据处理和相似性搜索领域占据着重要地位。 在当今信息爆炸的时代&#xff0c;数据规模呈指数级增长&#xff0c;如何从海量数据中快速准确地找到相似的数据成为了关键挑战。Faiss 应运而生…

【MeterSphere】占用磁盘空间过大问题处理方式

目录 一、现象 二、 清理docker系统命令&#xff08;效果不大&#xff09; 三、 追踪文件 四、 处理logs&#xff08;小处理&#xff09; 五、 对比容器问题发现node容器问题 六、结果 前言&#xff1a;部署ms使用一段时间&#xff0c;服务器监控发现磁盘空间占用过大&am…

基于SpringBoot的Java个人博客系统的设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

【Unity教程】使用 Animation Rigging实现IK制作程序化的动画手臂跟随手自动移动等效果

在 Unity 开发中&#xff0c;为角色创建逼真且自适应的动画是提升游戏体验的关键。在本教程中&#xff0c;我们将结合 Animation Rigging 工具和 IK&#xff08;Inverse Kinematics&#xff0c;反向运动学&#xff09;插件来实现程序化的动画。 视频教程可以参考b战大佬的视频…

CLIP模型(一)

一、概念 Contrastive Language-Image Pre-Training(利用文本的监督信息训练一个迁移能力强的视觉模型) CLIP任务&#xff1a; CLIP在完全不使用ImageNet中所有数据训练的前提下 直接Zero-shot得到的结果与Resnet在128W Imagenet数据局训练后效果一样 现在CLIP下游任务已经…

Java-Mybatis-MybatisPlus

文章目录 Mybatis基础概念持久层框架比较环境搭建及工程创建核心配置文件xxxMapper.xml文件mybatis实现过程junit测试mybatis及优化查询sql语句 Mybatis-plus基础概述组成及实现过程SpringbootMybatisPlus使用过程 实战插入操作默认id Mybatis 基础 概念 历史&#xff1a;My…

学分绩点预警系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

【图像去噪】论文精读:Toward Convolutional Blind Denoising of Real Photographs(CBDNet)

文章目录 前言Abstract1. Introduction2. Related Work2.1. Deep CNN Denoisers2.2. Image Noise Modeling2.3. Blind Denoising of Real Images 3. Proposed Method3.1. Realistic Noise Model3.2. Network Architecture3.3. Asymmetric Loss and Model Objective3.4. Trainin…

分享世界上最好的5个滑雪小镇

滑雪爱好者和冬季旅行者们&#xff0c;听好了。随着北半球变成冰雪仙境&#xff0c;是时候计划下一个冰雪覆盖的冒险了。 无论你是一个经验丰富的专业人士还是一个滑雪新手&#xff0c;我们整理了世界上五个最好的滑雪小镇&#xff0c;帮助你找到你完美的白雪覆盖的天堂。 这些…

CPMF复现笔记(2):训练MVTecAD-3D数据集, 精度SOTA

文章来自曹云康的最新论文《Complementary Pseudo Multimodal Feature for Point Cloud Anomaly Detection》,在MVTecAD-3D取得了最佳分数。代码地址GitHub - caoyunkang/CPMF: [PR] Complementary Pseudo Multimodal Feature for Point Cloud Anomaly Detection 复现效果 …

【ARM Hypervisor And SMMU 系列 5 -- SMMU 和 IOMMU技术】

文章目录 SMMU 和 IOMMU技术ARM 的 SMMUTranslation process overviewTBU 和 TCU 的关系TBUTCUTLBSMMU 和 IOMMU技术 文章 讲到了为支持I/O透传机制中的DMA设备传输而引入的IOMMU/SMMU技术,同时留了一个问题:IOMMU/SMMU是否可以同时支持GVA->GPA和GPA->HPA的转换? 答案…

【学习笔记】卫星网络(NTN)的窄带物联网(NB-IoT)研究 -- 3GPP TR 36.763(二)

目录 6 无线层1的问题及相关解决方案 6.1 IoT NTN参考参数 6.2 链路预算分析 6.2.1 链路预算参数 6.2.2.1.1 Set-1 6.2.2.1.2 Set-2 6.2.2.1.3 Set-3 6.2.2.1.4 Set-4 6.2.2.1.5 Set-5 6.3 时间和频率同步增强 6.3.1 GNSS位置固定对UE功耗的影响 6.3.1…

Java使用Graphics绘制图片文字边缘出现粗糙的锯齿问题解决

为什么会出现锯齿问题 文字出现锯齿的现象通常是由于显示设备的分辨率有限&#xff0c;无法完美地表现出字符的曲线和斜线的原因。 怎么解决 可以通过Graphics2D设置抗锯齿效果 // 打开抗锯齿效果g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VAL…

linux服务 学习

服务&#xff08;Service&#xff09; 在Linux操作系统中&#xff0c;服务&#xff08;Service&#xff09;是一个基本概念&#xff0c;它通常指的是运行在后台的、持续提供特定功能或资源给系统内部组件或者网络上的客户端程序。 这些服务是系统正常运行和提供各种功能的关键…

目标检测 | yolov7 原理和介绍

相关系列&#xff1a; 目标检测 | yolov1 原理和介绍 目标检测 | yolov2/yolo9000 原理和介绍 目标检测 | yolov3 原理和介绍 目标检测 | yolov4 原理和介绍 目标检测 | yolov5 原理和介绍 目标检测 | yolov6 原理和介绍 目标检测 | yolov7 原理和介绍 目标检测 | yolov8 原理和…

Maven-05.依赖管理-依赖配置

一.依赖管理-配置 例如&#xff1a;我们要在maven项目中导入logback日志依赖&#xff0c;那么我们编辑pom.xml文件。 <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</versio…

2023华为od机试C卷【转盘寿司】C 实现 单调栈

#include <stdio.h> #include <stdlib.h>/*单调栈 旋转寿司3 15 6 14 3 21 9 17*/ int main() {int i 0;int len 0;int data 0;int nums[501];char c ;while(scanf("%d",&nums[i]) 1){i;len;c getchar();if(c \n)break;}int *out NULL;int *s…