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

文本目录:

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

        ➷ 排序的概念:

           ➷ 常见的排序算法:

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

       ➷ 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.rhkb.cn/news/428885.html

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

相关文章

安全热点问题

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

HarmonyOS Next开发----使用XComponent自定义绘制

XComponent组件作为一种绘制组件&#xff0c;通常用于满足用户复杂的自定义绘制需求&#xff0c;其主要有两种类型"surface和component。对于surface类型可以将相关数据传入XComponent单独拥有的NativeWindow来渲染画面。 由于上层UI是采用arkTS开发&#xff0c;那么想要…

【医疗大数据】基于 B2B 的医疗保健系统中大数据信息管理的安全和隐私问题分析

基于 B2B 的医疗保健系统中大数据信息管理的安全和隐私问题分析 1、引言 1-1 医疗大数据的特点 10 V模型&#xff1a;在医疗领域&#xff0c;大数据的特点被描述为10 V&#xff0c;包括价值&#xff08;Value&#xff09;、体量&#xff08;Volume&#xff09;、速度&#xf…

Leetcode Hot 100刷题记录 -Day16(旋转图像)

旋转图像 问题描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1 输入&#xff1a;matrix [[1,2,3],[4,5,6]…

Python学习——【4.2】数据容器:tuple元组

文章目录 【4.2】数据容器&#xff1a;tuple元组一、元组的定义格式二、元组的特点三、元组的操作&#xff08;一&#xff09;常见操作&#xff08;二&#xff09;循环遍历 【4.2】数据容器&#xff1a;tuple元组 一、元组的定义格式 为什么需要元组 列表是可以修改的。如果想…

【网络安全】分享4个高危业务逻辑漏洞

未经许可,不得转载。 文章目录 正文逻辑漏洞1逻辑漏洞2逻辑漏洞3逻辑漏洞4其它正文 该目标程序是一家提供浏览器服务的公司,其核心功能是网页抓取和多账户登录操作,类似于浏览器中的隐身模式,但更加强大和高效。通过该平台,用户可以轻松管理并同时运行数百个隐身浏览器实…

Navicate 链接Oracle 提示 Oracle Library is not loaded ,账号密码都正确地址端口也对

Navicate 链接Oracle 提示 Oracle Library is not loaded ,账号密码都正确地址端口也对的问题 解决办法 出现 Oracle Library is not loaded 错误提示&#xff0c;通常是因为 Navicat 无法找到或加载 Oracle 客户端库&#xff08;OCI.dll&#xff09;。要解决这个问题&#x…

【自动驾驶】决策规划算法 | 数学基础(三)直角坐标与自然坐标转换Ⅱ

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

Centos中关闭swap分区,关闭内存交换

概述&#xff1a; Swap 分区是 Linux 系统中扩展物理内存的一种机制。Swap的主要功能是当全部的RAM被占用并需要更多内存时&#xff0c;用磁盘空间代理RAM内存。Swap对虚拟化技术资源损耗非常大&#xff0c;一般虚拟化是不允许开启交换空间的&#xff0c;如果不关闭Swap&…

LED显示屏迎来革新:GOB封装技术引领行业新风尚

在我们日常生活中&#xff0c;LED显示屏无处不在&#xff0c;从繁华的街头广告牌到家庭娱乐中心的大屏幕电视&#xff0c;它们都以鲜明的色彩和清晰的画质吸引着我们的目光。然而&#xff0c;在LED显示屏技术日新月异的今天&#xff0c;一种名为GOB&#xff08;Glue On Board&a…

ChatCADChatCAD+:Towards a Universal and Reliable Interactive CAD using LLMs

ChatCAD&#xff08;论文链接&#xff1a;[2302.07257] ChatCAD: Interactive Computer-Aided Diagnosis on Medical Image using Large Language Models (arxiv.org)&#xff09; 网络流程图&#xff1a; 辅助阅读&#xff1a; 基于大型语言模型的医学图像交互式计算机辅助诊…

7、论等保的必要性

数据来源&#xff1a;7.论等保的必要性_哔哩哔哩_bilibili 等级保护必要性 降低信息安全风险 等级保护旨在降低信息安全风险&#xff0c;提高信息系统的安全防护能力。 风险发现与整改 开展等级保护的最重要原因是通过测评工作&#xff0c;发现单位系统内外部的安全风险和脆弱…

基于SpringBoot的考研助手系统+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

c++9月20日

1.思维导图 2.顺序表 头文件 #ifndef RECTANGLE_H #define RECTANGLE_H#include <iostream>using namespace std;using datatype int ;//类型重定义class Seqlist { private://私有权限datatype *ptr; //指向堆区申请空间的起始地址int size;//堆区空间的长度int len …

在python爬虫中xpath方式提取lxml.etree._ElementUnicodeResult转化为字符串str类型

简单提取网页中的数据时发现的 当通过xpath方式提取出需要的数据的text文本后想要转为字符串&#xff0c;但出现lxml.etree._ElementUnicodeResult的数据类型不能序列化&#xff0c;在网上查找到很多说是编码问题Unicode编码然后解码什么的&#xff1b;有些是(导入的xml库而不…

【24华为杯数模研赛赛题思路已出】国赛B题思路丨附参考代码丨免费分享

2024年华为杯研赛B题解题思路 B题 WLAN组网中网络吞吐量建模 问题1 请根据附件WLAN网络实测训练集中所提供的网络拓扑、业务流量、门限、节点间RSSI的测试基本信息&#xff0c;分析其中各参数对AP发送机会的影响&#xff0c;并给出影响性强弱的顺序。通过训练的模型&#xff…

在SpringBoot项目中利用Redission实现布隆过滤器(布隆过滤器的应用场景、布隆过滤器误判的情况、与位图相关的操作)

文章目录 1. 布隆过滤器的应用场景2. 在SpringBoot项目利用Redission实现布隆过滤器3. 布隆过滤器误判的情况4. 与位图相关的操作5. 可能遇到的问题&#xff08;Redission是如何记录布隆过滤器的配置参数的&#xff09;5.1 问题产生的原因5.2 解决方案5.2.1 方案一&#xff1a;…

夏日遛娃绝佳之地:气膜儿童乐园—轻空间

随着夏季的到来&#xff0c;炎炎烈日让户外活动变得有些艰难。然而&#xff0c;在城市的某个角落&#xff0c;一座气膜儿童乐园却为家长和孩子们提供了一个理想的避暑天堂。这里的恒温控制保持在舒适的27℃&#xff0c;让孩子们在欢乐中享受每一个夏日的阳光&#xff0c;而家长…

由于安全风险,安全领导者考虑禁止人工智能编码

安全团队与开发团队之间的紧张关系 83% 的安全领导者表示&#xff0c;他们的开发人员目前使用人工智能来生成代码&#xff0c;57% 的人表示这已成为一种常见做法。 然而&#xff0c;72% 的人认为他们别无选择&#xff0c;只能允许开发人员使用人工智能来保持竞争力&#xff0…

IDA Pro基本使用

IDA Pro基本使用 1.DllMain的地址是什么? 打开默认在的位置1000D02E就是DllMain地址 按空格键可以看到图形化界面选择options、general勾选对应的选项在图像化也能看到 2.使用Imports 窗口并浏览到 gethostbyname&#xff0c;导入函数定位到什么地址? 这里可以打开Impo…