【Java数据结构】---七大排序(插入排序和选择排序)

news2024/10/23 11:28:49

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言 ,Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

什么是排序?

使一串数据根据大小,递增或递减的排列起来的操作

排序的稳定性

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

常见的排序分组

在这里插入图片描述

插入排序

待排序的数据按其关键码值的大小逐个插入到一个已经排好序的 有序序列中,直到所有的数据插入完为止,得到一个 新的有序序列

eg:斗地主时整理牌的思想

直接插入排序

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

一般情况下,我们排序都是排升序。

在这里插入图片描述
此图仅仅展示了必要步骤

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

在这里插入图片描述
总结:
· 对于直接插入排序,越有序,排序越快,所以如果一组数据趋于有序时,可以优先选择直接插入排序
· 时间复杂度:O(n^2)
· 空间复杂度:O(1)
· 稳定性:稳定

希尔排序

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

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){
    for (int i = gap; i < array.length; i++) {
        int tmp=array[i];
        int j = i-gap;
        for (; j >=0 ; j=j-gap) {
            if (tmp<array[j]){
                array[j+gap]=array[j];
            }
            else {
                break;
            }
        }
        array[j+gap]=tmp;
    }
}

总结: 希尔排序是对直接插入排序的优化
· 因为分组的值取法各不相同,所以很难去算时间复杂度
· 空间复杂度:O(1)
· 稳定性:不稳定

选择排序

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

直接选择排序

升序排序来说,直接选择排序可以将一个序列看成两个部分:已经有序的序列待排序的序列每一趟从待排序序列中选取一个最小的元素 ,与待排序序列的第一个元素相比较 ,如果这个最小的元素小于 待排序序列第一个元素,则交换 这两个元素的位置,然后原先这个待排序序列的第一个元素就变成了有序序列的最后一个

在这里插入图片描述

public static void main(String[] args) {
        int[] array={10,6,18,20,8};
        System.out.println("排序前:"+ Arrays.toString(array));
        selectSort(array);
        System.out.println("排序后:"+ Arrays.toString(array));
    }
    public static void selectSort(int[] array){
        int minIndex=0,tmp;
        for (int i = 0; i < array.length; i++) {
            //初始化最小值的下标为第一个待排序数据下标
            minIndex=i;
            //遍历待排序数据,找最小数据,更新下标
            for (int j = i+1; j < array.length; j++) {
                if(array[j]<array[minIndex]){
                    minIndex=j;
                }
            }
            if(minIndex==i){
                continue;
            }
            //交换
            tmp=array[i];
            array[i]=array[minIndex];
            array[minIndex]=tmp;
        }
    }

在这里插入图片描述

总结: 直接选择排序思路非常简单,但是效率太低(不是在遍历中,就是在去遍历的路上)

  1. 时间复杂度:O(N^2)
  2. 空间复杂度:O(1)
  3. 稳定性:不稳定

堆排序

堆排序是指利用树(堆)这种数据结构所设计的一种排序算法,需要注意的是排升序要建大堆,排降序建小堆

堆的理解可以参考二叉树,如果对二叉树有所遗忘,可以回顾之前的博客【Java数据结构】— 二叉树

对于排升序采用大根堆每个结点的值都大于或等于其左右孩子结点的值

在这里插入图片描述

我们根据最后一个非子叶节点(array.length/2-1),从左到右,由上到下开始调整

在这里插入图片描述

找第二个非子叶节点,继续调整,满足大根堆定义(注意:此时20与10进行交换后,可能导致子树结构混乱,需要继续调整。) 此时刚好满足条件,不需要调整

在这里插入图片描述

回到选择排序定义:将堆顶元素末尾元素进行交换,使末尾元素最大

在这里插入图片描述

然后继续调整堆, 再 将堆顶元素与末尾元素交换,得到第二大元素 如此反复进行交换、重建、交换。

在这里插入图片描述

最后得到升序排列

在这里插入图片描述

public static void main(String[] args) {
        int[] array={10,6,18,20,8};
        System.out.println("排序前:"+Arrays.toString(array));
        heapSort(array);
        System.out.println("排序后:"+Arrays.toString(array));
    }
    public static void heapSort(int[] array){
        for (int i = array.length/2-1; i>=0 ; i--) {
            swapHeap(array,i, array.length);
        }
         //继续交换堆顶元素和当前末尾元素
        for (int j = array.length-1; j > 0; j--) {
            int tmp=array[j];
            array[j]=array[0];
            array[0]=tmp;
             //重新调整结构,满足大根堆定义
            swapHeap(array,0,j);
        }
    }

    /**
     *
     * @param array 要调整的数组
     * @param i 非叶子节点的下标
     * @param length 表示待排序数组长度
     */
    public static void swapHeap(int[] array,int i,int length){
        //保存临时变量
        int tmp=array[i];
        //j是i节点的右子节点
        for (int j = i*2+1; j < length; j=j*2+1) {
            //如果右子节点下标有效 并且 左子节点《右子节点
            if(j+1<length && array[j]<array[j+1]){
                //下标递增
                j++;
            }
            //如果右子节点》父节点
            if(array[j]>array[i]){
                //交换
                array[i]=array[j];
                i=j;
            }else{
                break;
            }
        }
        //调整为大根堆
        array[i]=tmp;
    }

在这里插入图片描述

完结

好了,到这里Java语法部分就已经结束了~
如果这个系列博客对你有帮助的话,可以点一个免费的赞并收藏起来哟~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散~~Java

下期预告: 【Java数据结构】- - -排序

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

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

相关文章

新的一轮前端面试已来临,避坑指南来 get!

最近看到很多人都在投简历&#xff0c;可是很多人对待面试不够认真&#xff0c;只会等待结果&#xff0c;不去努力。所以整理一些懒人面试技巧给大家。 我们说说目前应用面积最广的 Vue&#xff0c;大厂或是高级工程师面试的时候究竟会碰到什么棘手或是难缠的 Vue 的面试题呢&a…

数据结构:LRU Cache

数据结构&#xff1a;LRU Cache LRU Cache实现类架构setget测试 总代码 LRU Cache cache意为缓存&#xff0c;硬件层面指CPU与主存之间的缓存&#xff0c;用于减缓两者之间的速度差距。广义上&#xff0c;可以把cache简单理解为一个临时存储区域。 cache的容量是非常有限的&a…

从0到1掌握大模型

人人都看得懂的大模型简介 大模型就像一座庞大的图书馆&#xff0c;里面有非常多的书籍。但与普通图书馆不同的是&#xff0c;这座图书馆中的每本书都是关于不同事物的描述和知识。而这些书籍中的每一页都代表了这个事物的一些特征或细节。现在&#xff0c;想象一下&#xff0…

前端文件流导出

1、前端代码 ​ /** 导出 */ const handleExport async () > {let config {responseType: blob,headers: {Content-Type: application/json,},};const res await getTargetExport(config);const blob new Blob([res]);const fileName PK目标跟进导出列表.xls;const li…

基于Python绘制一个三角形

一、程序 import turtledef draw_triangle(side_length):# 初始化turtle对象并设置速度my_turtle turtle.Turtle()my_turtle.speed(1)# 绘制三角形for _ in range(3):my_turtle.forward(side_length)my_turtle.left(120)# 结束后关闭窗口防止立即退出turtle.done()# 设定三角…

前端面试经验总结1(简历篇)

本文分为3部分&#xff0c;分别为第一部分简历篇&#xff0c;第二部分经典问题篇以及第三部分知识体系篇&#xff0c;都是个人面试经验及同行面试经验总结和整理。 我对于简历的理解是这样的&#xff0c;简历的作用是让看简历的人能够快速、准确地捕捉到有用信息&#xff1a; 你…

【MATLAB源码-第274期】基于matlab的高阶累积量矩阵和PCA的JADE算法在盲信号分离中的应用仿真,输出源信号,混合信号和分离信号。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 基于高阶累积量矩阵和主成分分析&#xff08;PCA&#xff09;的JADE算法是一种典型的盲源分离算法&#xff0c;在信号处理领域中&#xff0c;广泛应用于分离混合信号的独立源。盲源分离问题的核心在于从观测信号中提取出源信…

【C语言】动态内存管理(下)

本篇博客将讲解以下知识&#xff1a; 1、calloc和realloc 2、常见的动态内存错误 1、calloc和realloc &#xff08;1&#xff09;calloc C语言中还提供了一个函数叫calloc&#xff0c;calloc也用来动态内存分配 calloc函数原型&#xff1a; void* calloc(size_t num, …

基于springboo+vue+mysql私人西服定制设计与实现(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

初始Python篇(2)——逻辑控制、序列

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 顺序结构 选择结构 循环结构 遍历循环-for break 和 continue 无限循环-while pass空语句 猜数字小游戏 序列 序列相…

如何管理和维护自动化测试

将测试数据、测试脚本和测试结果进行有效的管理和维护是软件测试过程中的重要任务&#xff0c;它直接关系到测试的质量和效率。以下是对这三个方面分别进行管理和维护的具体建议&#xff1a; 一、测试数据的管理和维护 1. 数据收集 来源选择&#xff1a;测试数据主要来源于生…

Redis 简单编写C++客户端

我们之前的学习都是通过Redis自带的命令行式的客户端来使用Redis的&#xff0c;我们在执行命令的时候&#xff0c;都是手动执行的。然而这种操作方式并不是日常开发的主要形式。 更多的时候&#xff0c;是使用Redis的api来实现定制化的Redis客户端程序&#xff0c;进一步来操作…

一场被真话包场的前端面试记录……

​ 面试官&#xff1a;等很久了吧&#xff0c;我是故意的&#xff01;这不是要装的忙一点&#xff0c;让领导看看嘛。前端小李&#xff1a;看你们这公司不大&#xff0c;破事倒是不少&#xff01;要不是到门口了&#xff0c;我都想回去。面试官&#xff1a;没错&#xff0c;我们…

为什么kafka处理速度这么快啊!?

Apache Kafka 是一个开源的分布式事件流平台&#xff0c;具有高吞吐量、可扩展性和持久性等特点。目前被广泛使用&#xff0c;本文将介绍kafka的组成部分、特点&#xff0c;并且解释为什么kafka能够快速处理。 一、基本组成部分 1. 消息&#xff08;Message&#xff09;&#x…

【AAOS】Android Automotive 14模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r20 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch sdk_car_x86_64-trunk_staging-eng make -j8 运行效果 emualtor Home All apps …

Nature 正刊丨镊子时钟的通用量子运算和基于ancilla的读出

01摘要 通过利用纠缠来提高测量精度是量子计量学长期追求的目标1,2。然而&#xff0c;在存在噪声的情况下获得量子理论允许的最佳灵敏度是一个突出的挑战&#xff0c;需要最佳的探测态生成和读出策略3,4,5,6,7。中性原子光学钟8是测量时间的主要系统&#xff0c;在纠缠产生方面…

【C++贪心 分治】1717. 删除子字符串的最大得分|1867

本文涉及知识点 贪心 分治 LeetCode1717. 删除子字符串的最大得分 给你一个字符串 s 和两个整数 x 和 y 。你可以执行下面两种操作任意次。 删除子字符串 “ab” 并得到 x 分。 比方说&#xff0c;从 “cabxbae” 删除 ab &#xff0c;得到 “cxbae” 。 删除子字符串"…

IEEE出版:第十二届信息系统与计算技术国际学术会议参会邀请

第十二届信息系统与计算技术国际会议&#xff08;ISCTech 2024&#xff09;将于2024年11月8-11日在西安举办&#xff0c;聚焦信息系统与计算技术领域&#xff0c;邀请专家学者参与交流。投稿论文将经严格审稿并出版至IEEE Xplore&#xff0c;支持EI等检索。会议涵盖多个主题&am…

编译cifx的驱动代码报错“netlink/cli/utils.h: No such file or directory”

ethercat编译时遇到netlink/cli/utils.h: No such file or directory 确认已安装对应的库&#xff1a; sudo apt-get install libnl-3-devsudo apt-get install libnl-genl-3-dev依旧编译失败&#xff0c;找到文件所在路径。 发现该路径在系统默认的库查找路径内 选择创建软链…

MySQL数据库操作——(2)

3 DML&#xff08;数据操作&#xff09; 3.1 添加数据 insert语法&#xff1a; 向指定字段添加数据 insert into 表名 (字段名1, 字段名2) values (值1, 值2); 全部字段添加数据 insert into 表名 values (值1, 值2, ...); 批量添加数据&#xff08;指定字段&#xff09; ins…