Java-数据结构-排序-(一) (。・ω・。)

news2024/9/21 20:18:14

文本目录:

❄️一、排序的概念及引用:

        ➷ 排序的概念:

           ➷ 常见的排序算法:

❄️二、插入排序的实现:

       ➷ 1、直接插入排序:

                 ☞ 直接插入排序的基本思想:

                ☞ 直接插入排序的实现:

     ▶ 思路:

      ▶ 代码:

        ➷ 2、希尔排序:

                 ☞ 希尔排序的基本思想:

                ☞ 希尔排序的实现:

     ▶ 思路:

      ▶ 代码:

 ❄️三、选择排序的实现:

       ➷ 1、选择排序:

                 ☞ 基本思想:

                ☞ 选择排序的实现:

     ▶ 思路:

      ▶ 代码:

       ➷ 2、堆排序:

 ❄️总结:


❄️一、排序的概念及引用:

        ➷ 排序的概念:

1、排序:

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

2、 稳定些:

        这个呢我们直接来看图来理解:

这个呢就是我们的稳定性,当我们的排序中存有两个相同的元素,这相同的元素不能改变顺序。 

 3、内部排序:

           数据元素全部存放在内存中的排序。

4、外部排序:

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


           ➷ 常见的排序算法:

我们直接来看看对于这个排序算法的图片,直接来了解一下:

所以共有 四大类七种排序 方法。 


❄️二、插入排序的实现:

        1、直接插入排序:

                 ☞ 直接插入排序的基本思想:

它呢就是一种简单的插入排序,其思想就是:

       把所有待排序的记录按照关键值的大小逐个插入到已排序的有序序列中,直到所有的记录都插入完毕即可,得到一个新的有序序列。

       我们呢对于 打扑克牌 呢就是这种的一个排序方法。


                ☞ 直接插入排序的实现:

     ▶ 思路:

      我们把我们要插入的数值存放到一个临时变量中,之后和这个数值之前的拍好序的数值都进行比较,如果比其小,就把这个数值往后移动,之后再把我们要插入的数值放到空余的位置上。

这里要注意我们的第一个数据就是有序的,因为只有一个数值,所以第一个值不用比较直接保存。

      我们直接来看看其流程图是什么样的:

 这就是我们的 直接插入排序 的思路了,我们接下来看看代码的实现吧。


      ▶ 代码:
/**
 * 元素集合越接近有序,直接插入排序算法的时间效率越高
 * 时间复杂度为O(N^2)
 * 空间复杂度为O(1)
 * 稳定性:稳定的排序
 * @param array
 */
public static void insetSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int tmp = array[i];
            int j = i - 1;
            for (; j >= 0; j--) {
                if (array[j] > tmp) {
                    array[j + 1] = array[j];
                }else {
                    array[j + 1] = tmp;
                    break;
                }
            }
            //这是当我们的 j < 0的时候呢,
            //我们退出循环之后相当于 j+1 为0下标
            array[j + 1] = tmp;
        }
    }

我们来看看运行的结果: 

说明这个 直接插入排序 没有任何的问题。


         2、希尔排序:

                 ☞ 希尔排序的基本思想:

    希尔排序又称缩小增量法。基本思想就是:先选定一个整数 gap,把待排序的数据分成多个组,所有距离为指定记录的分在同一个组中,对每一个组内的记录进行排序,之后重复上述的过程直至我们的 gap == 1 的时候,所有记录在同一组内排序,就完成了希尔排序了


                ☞ 希尔排序的实现:

     ▶ 思路:

       其实我们的分组排序就是相当于我们的在每一个组中进行插入排序。

       不管我们最开始如何的分组,最后一定是变成一组数据,进行插入排序。我们在介绍插入排序的时候,是不是说过数据越有序就排的越快,所以我们的在最后一次排序之前都是在尽量的把数据变成有序的,就相当于是预排序的

       我们来看看这个是如何进行的分组排序的,我们在 直接插入排序 的时候呢,我们的 i 是从1下标开始的,这里呢为我们的 i 下标从 gap 开始,之后我们的 j 下标就是 i - gap 就是 j 下标,这里的 j 就是每次比较完之后都是 j - gap ,我们的每次排完之后呢,我们的 i++ 就可以了,尽管我们的一组没有排完,也是没有问题的,因为我们在 i++ 之后呢还是可以再次排到这组的

        我们来看看流程是什么样的:

      由此我们可以看出,在我们的 gap = 1 之前呢,我们的 预排序 都是将数值大的放到了后面,数值小的放到前面,可以使我们的在最后一次排序中执行的更快。 因为这样就可以趋于有序了。

      我们对于 gap 这个值呢到现在为止都没有给出一个准确的一个求值方法,最后使 gap 得到 1 就可以了,我们这里直接使用 gap = gap / 2 。

我们来看看代码如何编写的:


      ▶ 代码:
/**
 * 时间复杂度为:O(N) 这个不是很准确的,但是比直接插入排序快
 * 空间复杂度为:O(1)
 * 稳定性:不稳定的
 * @param array
 */
public static void shellSort(int[] array) {
        int gap = array.length;
        while(gap > 1) {
            gap = gap / 2;
            shell(array,gap);
        }
}

private 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 -= gap) {

                if (array[j] > tmp) {
                    array[j + gap] = array[j];
                }else {
                    array[j + gap] = tmp;
                    break;
                }
            }

            array[j + gap] = tmp;
        }
}

来看看运行的结果: 

我们可以看到这个结果是没有问题的。 


 ❄️三、选择排序的实现:

        1、选择排序:

                 ☞ 基本思想:

      就是每次都在待排序中选择出最小的数据,存放到数据的起始位置,直到所有的待排序的数据都排完。


                ☞ 选择排序的实现:

     ▶ 思路:

      我们就是把数组的第一个下标为 i 计为最小的数据把其下标放到 mixIndex,之后我们的定义一个 j 下标设为 i + 1 ,这个 j 下标的值看是不是比 我们 mixIndex 的下标的值小,如果小就把其变成 mixIndex 下标,直到我们把数组遍历结束,我们再把 mixIndex 和 i 下标的值交换一直循环这个操作直至我们的 i 大于等于我们的数组长度

       我们来看看这个操作的流程图是什么样的:

这就是我们的选择排序的流程图了,我们之后来看看我们代码如何编写: 


      ▶ 代码:
/**
 * 选择排序
 * 时间复杂度:O(N^2)
 *     和数据是否有序有关
 * 空间复杂度:O(1)
 * 稳定性:不稳定的
 * @param array
 */
public static void selectSort(int[] array) {

       for (int i = 0; i < array.length; i++) {
            int mixIndex = i;
            for (int j = i + 1; j < array.length; j++) {
                if (array[j] < array[mixIndex]) {
                    mixIndex = j;
                }
            }
            swap(array,i,mixIndex);
        }
}

private static void swap(int[] array,int i,int mixIndex) {
        int tmp = array[i];
        array[i] = array[mixIndex];
        array[mixIndex] = tmp;
}

    对于这个 选择排序 呢我们还有一个优化的,我们上面的代码是从一边找,我们优化呢就是从边找一边找最小值,一边找最大值,我们需要设置两个变量 left 是在数组的开头,right 在数组的结尾,开头的存放最小值,结尾的存放最大值,存放之后把left++,right--,直到它们相遇结束

我们来看看流程图:

    这里我们需要注意的问题:当我们的最大值就是left这个下标的话,当我们和最小值交换后。最大值就会找不到,所以这里要有一个判断,当我们把最小值交换后,我们的最大值在left中时候把maxIndex = minIndex,就是我们的最大值了

    这里也要注意我们的 i 的范围不能超过 right。

我们来看看优化后的代码的编写:

private static void swap(int[] array,int i,int mixIndex) {
        int tmp = array[i];
        array[i] = array[mixIndex];
        array[mixIndex] = tmp;
    }

    public static void selectSort2(int[] array) {
        //优化后的代码
        int left = 0;
        int right = array.length - 1;
        while (left < right) {
            int minIndex = left;
            int maxIndex = left;

            for (int i = left + 1; i <= right; i++) {
                if (array[i] < array[minIndex]) {
                    minIndex = i;
                }
                if (array[i] > array[maxIndex]) {
                    maxIndex = i;
                }
            }
            //交换
            swap(array,left,minIndex);

            if (maxIndex == left) {
                maxIndex = minIndex;
            }

            swap(array,right,maxIndex);

            left++;
            right--;
        }
    }

        2、堆排序:

     这个排序我们上一篇博客中已经有所介绍了,这里呢我们直接来看看代码就可以了,如果对于这个代码看不懂,我们的呢可以传送到上一篇博客中:

                Java-数据结构-优先级队列(堆)-(二) (゚▽゚*)

代码: 

private static void swap(int[] array,int i,int mixIndex) {
        int tmp = array[i];
        array[i] = array[mixIndex];
        array[mixIndex] = tmp;
    }

private static void siftDown(int[] array,int parent,int length) {
        int child = (parent * 2) + 1;
        while (child < length) {
            if (child + 1 < length && array[child + 1] > array[child]) {
                child++;
            }
            if (array[parent] < array[child]) {
                swap(array,child,parent);
                parent = child;
                child = (parent * 2) + 1;
            }else {
                break;
            }
        }
    }


    private static void creatHeap(int[] array) {
        for (int parent = (array.length - 1 -1) / 2; parent >= 0 ; parent--) {
            //向下调整创建堆
            siftDown(array,parent,array.length);
        }
    }


    /**
     * 堆排序
     * 时间复杂度:O(n*logN)
     * 空间复杂度:O(1)
     * 稳定性:不稳定
     * @param array
     */
    public static void HeapSort(int[] array) {
        creatHeap(array);
        int end = array.length - 1;
        while (end > 0) {
            swap(array,0,end);
            siftDown(array,0,end - 1);
            end--;
        }
    }

 ❄️总结:

     OK,我们这次的关于排序的博客就到这里就结束了,我们已经介绍了两大类的排序方法了,接下来我们再来看看另外的两大类的排序,让我们的尽情期待吧!!!拜拜~~~

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

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

相关文章

UI自动化测试(python)Web端4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

PyCharm与Anaconda超详细安装配置教程

1、安装Anaconda&#xff08;过程&#xff09;-CSDN博客 2.创建虚拟环境conda create -n pytorch20 python3.9并输入conda activate pytorch20进入 3.更改镜像源conda/pip(只添加三个pip源和conda源即可) 4.安装PyTorch&#xff08;CPU版&#xff09; 5.安装Pycharm并破解&…

使用 Anaconda 环境在Jupyter和PyCharm 中进行开发

目录 前言 一、在特定环境中使用jupyter 1. 列出所有环境 2. 激活环境 3. 进入 Jupyter Notebook 二、在特定环境中使用pycham 1. 打开 PyCharm 2. 打开设置 3. 配置项目解释器 4. 选择 Conda 环境 5. 应用设置 6. 安装所需库&#xff08;如果需要&#xff09; 总结 &#x1f3…

2024年中国研究生数学建模竞赛C题——解题思路

2024年中国研究生数学建模竞赛C题——解题思路 数据驱动下磁性元件的磁芯损耗建模——解决思路 二、问题描述 为解决磁性元件磁芯材料损耗精确计算问题&#xff0c;通过实测磁性元件在给定工况&#xff08;不同温度、频率、磁通密度&#xff09;下磁芯材料损耗的数据&#xf…

卡西欧相机SD卡格式化后数据恢复指南

在数字摄影时代&#xff0c;卡西欧相机以其卓越的性能和便携性成为了众多摄影爱好者的首选。然而&#xff0c;随着拍摄量的增加&#xff0c;SD卡中的数据管理变得尤为重要。不幸的是&#xff0c;有时我们可能会因为操作失误或系统故障而将SD卡格式化&#xff0c;导致珍贵的照片…

在线骑行网站设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装在线骑行网站软件来发挥其高效地信息处理的作用&#xff0c…

C++之深拷贝和浅拷贝*

两者本质&#xff1a; 浅拷贝&#xff1a;简单的赋值拷贝操作 深拷贝&#xff1a;在堆区中重新申请空间&#xff0c;进行拷贝操作new & delete 注意事项&#xff1a;堆区是在地址中重新申请空间&#xff0c;所以后续一系列操作new delete是通过指针* age进行操作&#xff0…

某 XXX 云主机,使用感受

简单来说就是: 垃圾&#xff01; 1. 登录垃圾。 我都已经实名认证了&#xff0c; 手机验证码非要发2遍。非要给我起个很难记住的账户名 2. 文档垃圾。 太高估用户的水平了。 建议做点视频教程。而不是各种文档&#xff0c;互相链接&#xff0c;转来转去&#xff0c; 让人心…

LeetCode[简单] 20.有效的括号

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

NRK3502空气净化器语音芯片方案,本地识别算法+芯片架构

随着环境污染问题的日益严重&#xff0c;空气净化器成为人们居家、办公环境中不可或缺的设备&#xff0c;为了提升用户体验和产品性能&#xff0c;广州九芯电子研发出了一款创新的空气净化器语音芯片方案--NRK3502。此方案结合了本地识别算法与芯片架构&#xff0c;提供Turnkey…

SpringBoot+vue集成sm2国密加密解密

文章目录 前言认识SM2后端工具类实现引入依赖代码实现工具类&#xff1a;SM2Util 单元测试案例1&#xff1a;生成服务端公钥、私钥&#xff0c;前端js公钥、私钥案例2&#xff1a;客户端加密&#xff0c;服务端完成解密案例3&#xff1a;服务端进行加密&#xff08;可用于后面前…

巴蒂克图案识别系统源码分享

巴蒂克图案识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

安全热点问题

安全热点问题 1.DDOS2.补丁管理3.堡垒机管理4.加密机管理 1.DDOS 分布式拒绝服务攻击&#xff0c;是指黑客通过控制由多个肉鸡或服务器组成的僵尸网络&#xff0c;向目标发送大量看似合法的请求&#xff0c;从而占用大量网络资源使网络瘫痪&#xff0c;阻止用户对网络资源的正…

手把手教你java+selenium数据驱动测试框架搭建与实践

最近在看JavaseleniumTestNgExcel的数据驱动&#xff0c;如何使用TestNg和Excel进行数据驱动测试。我其实是个自动化测试小白&#xff0c;工作之余看看这方面的书&#xff0c;照着敲敲代码&#xff0c;慢慢理解&#xff0c;希望通过自己坚持不懈的努力&#xff0c;在测试这个职…

Python语言基础教程(下)4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

记录一下(goland导入其他包方法编译不了爆红但能正常使用)

在goLand里面新建go文件,里面放了一个方法,首字符也大写了,但是在别的包里面报错显示无法识别,爆红显示,但是项目能正常运行,这里说下我的解决方案 即可解决

软件设计师——操作系统

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;软考——软件设计师&#x1f3c5;往期回顾&#x1f3c6;&#xff1a;C: 类和对象&#xff08;上&#xff09;&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱 一、操作系统…

粘接黑科技标杆专业展会-ASE CHINA 2024 震撼开幕!

2024年9月19日&#xff0c;第27届国际胶粘剂及密封剂展暨第19届国际胶粘带与薄膜展&#xff08;以下简称ASE CHINA 2024&#xff09;在上海新国际博览中心N3-N4-N5馆璀璨揭幕。ASE CHINA作为粘接新材料产业风向标&#xff0c;历经27年的辛苦耕耘&#xff0c;与业界同仁并肩而行…

发布策略说明

发布策略说明 发布策略 区别 标准发布 在部署新版本应用时删除旧版本应用。发布过程中&#xff0c;您的服务会出现短暂中断。 蓝绿发布 应用更新时生成蓝绿两个版本&#xff0c;两个版本互相热备&#xff0c;通过切换路由权重的方式实现不同版本应用的上下线。 该发布策略具…

Moshi: a speech-text foundation model for real time dialogue

视频号 挺神奇的东西 整下来 kyutai-labs/moshi (github.com) git clone https://github.com/kyutai-labs/moshi.git 在线体验 moshi.chat 结束后 点击Download audio Download video 可以下载音频与视频 &#xff08;不过是webm格式&#xff09; 发行版 已上传至资源 小…