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.xdnf.cn/news/1541453.html

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

相关文章

OBB-最小外接矩形包围框-原理-代码实现

前言 定义&#xff1a;OBB是相对于物体方向对齐的包围盒&#xff0c;不再局限于坐标轴对齐&#xff0c;因此包围点云时更加紧密。优点&#xff1a;能够更好地贴合物体形状&#xff0c;减少空白区域。缺点&#xff1a;计算较为复杂&#xff0c;需要计算物体的主方向&#xff0c…

linux 操作系统下dhcpd命令介绍和案例应用

linux 操作系统下dhcpd命令介绍和案例应用 DHCP&#xff08;动态主机配置协议&#xff09;在Linux操作系统中用于自动为网络中的设备分配IP地址和其他网络配置 DHCP的基本概念 DHCP协议通过UDP工作&#xff0c;主要有两个用途&#xff1a; 自动分配IP地址给网络中的设备。提…

Sn=a+aa+aaa+aaaa+aaaaa的前五项之和,其中a是一个数字

//计算求和 //Snaaaaaaaaaaaaaaa的前五项之和&#xff0c;其中a是一个数字 //如&#xff1a;222222222222222 #include<stdio.h> #include<math.h> #define A 2 //数字a #define B 5 //前几项的和 int main() {int n 0;int sum 0;int i 0;for (i 0; i <B;…

STM32F407单片机编程入门(十一) ESP8266 WIFI模块实战含源码

文章目录 一.概要二.ESP8266 WIFI模块主要性能参数三.ESP8266 WIFI模块芯片内部框图四.ESP8266 WIFI模块原理图五.ESP8266 WIFI模块与单片机通讯方法1.硬件连接2.ESP8266模块AT指令介绍 六.STM32单片机与ESP8266WIFI模块通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 …

变电站绝缘套管红外检测数据集

包含以下4个数据文件&#xff1a; /train&#xff1a;训练集 /valid&#xff1a;验证集 /test&#xff1a;测试集 README.txt&#xff1a;数据说明 【数据说明】检测目标以Pascal VOC格式进行标注&#xff0c;对每个图像进行以下预处理&#xff0c;统一调整大小为640x640。数据…

死机检测电路

目录&#xff1a; 1、死机检测概述 2、活机状态 3、死机状态 1、死机检测概述 本内容分享一个“死机检测电路”&#xff0c;用作单片机&#xff08;MCU&#xff09;死机时&#xff0c;不至于持续给负载供电。‌持续负载供电&#xff0c;比如加热丝&#xff0c;可能会引发严…

在腾讯云申请https(我得是腾讯云服务器),通过宝塔设置https

参考 一键 HTTPS&#xff1a;https://cloud.tencent.com/document/product/400/58062 DNS 验证&#xff1a;https://cloud.tencent.com/document/product/400/54500?from_cn_redirect1 申请免费的证书 访问连接&#xff1a;https://console.cloud.tencent.com/ssl 点击页…

hive分区详细教程

为什么要分区&#xff1f; 为了提高sql的查询效率 比如&#xff1a; select * from orders where create_date20230826; 假如数据量比较大&#xff0c;这个sql就是全表扫描&#xff0c;速度肯定慢。 可以将数据按照天进行分区&#xff0c;一个分区就是一个文件夹&#xff0c;当…

软件设计师——操作系统

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

伊犁云计算22-1 linux 逻辑卷管理

&#xff11;  三块硬盘  &#xff53;&#xff41;&#xff54;&#xff41;  先做组&#xff0c;再做逻辑 第一步添加三块硬盘&#xff0c;然后分区&#xff0c;装文件系统 这个过程参考之前的文章不说 新增了三块 &#xff53;&#xff44;&#xff42; &#xff…

vue3 快速入门系列 —— 基础

基础 前面我们已经用 vue2 和 react 做过开发了。 AIAutoPrediction 从 vue2 升级到 vue3 成本较大&#xff0c;特别是较大的项目。所以许多公司对旧项目继续使用vue2&#xff0c;新项目则使用 vue3。 有些UI框架&#xff0c;比如ant design vue1.x 使用的 vue2。但现在 an…

老年人养生之道:岁月静好,健康常伴

老年人养生之道&#xff1a;岁月静好&#xff0c;健康常伴 随着年岁的增长&#xff0c;老年人更需注重养生&#xff0c;以维持身心的和谐与健康&#xff0c;享受幸福晚年。养生不仅是一种生活态度&#xff0c;更是一种智慧的选择&#xff0c;它涵盖了饮食、运动、心理、社交等…

基于MPA-BP-Adaboost的多输入回归预测|海洋捕食者优化-BP神经网络

目录 一、主要内容&#xff1a; 二、运行效果&#xff1a; 三、Adaboost步骤&#xff1a; 四、MPA-BP的优化步骤&#xff1a; 五、本文完整代码数据下载&#xff1a; 一、主要内容&#xff1a; 本代码结合了海洋捕食者优化&#xff08;MPA&#xff09;算法与BP神经网络和A…

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

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

抖音矩阵系统源码搭建,矩阵系统贴牌,矩阵工具开源

1. 抖音短视频矩阵系统 抖音短视频矩阵系统&#xff0c;是指通过抖音平台&#xff0c;以矩阵的形式进行短视频创作、发布和传播的一种模式。它以多样化的内容、丰富的表现形式、高度的专业化和协同性&#xff0c;吸引了大量用户和创作者的关注。 2. 短视频矩阵系统的优势 2.1 …

BLE 设备丢包理解

前言 个人邮箱&#xff1a;zhangyixu02gmail.com在学习 BLE 过程中&#xff0c;总能听到 “丢包” 一词&#xff0c;但是我查阅资料又发现&#xff0c;有大佬说&#xff0c;ATT所有命令都是“必达”的&#xff0c;不存在所谓的“丢包”。而且我发现&#xff0c;在宣传 BLE 产品…

力扣中等 153.寻找旋转排序数组中的最小值

文章目录 题目介绍题解 题目介绍 题解 正解&#xff1a;可以和数组最后一个数比较&#xff0c;来判定二分的位置是在最小值的左侧还是在最小值的右侧。 在0到n-2二分&#xff0c;如果nums[mid] > nums[n - 1]&#xff0c;则mid在最小值的左侧&#xff0c;mid和其左侧染成红…

[每周一更]-(第115期):不同系统安装godoc

文章目录 主要功能 安装WindowsmacOSLinux环境变量配置WindowsmacOS 和 Linux 如何使用 godoc 生成自己项目的文档1. 安装 godoc2. 编写注释3. 启动 godoc 服务器4. 访问文档 生成静态文档示例输出总结 godoc 是一个 Go 语言的工具&#xff0c;用于生成和查看 Go 代码的文档。它…

SAP HCM 每月生成年假解决方案(PT_QTA00)

每月生成年假定额&#xff1a;HCM复杂的模块&#xff0c;年假生成就是一个比较复杂的模块&#xff0c;每次做项目都比较怕做年假、余假生成的业务&#xff0c;因为企业业务复制&#xff0c;SAP的这块配置也很复杂&#xff0c;因为这里面涉及的知识面很多&#xff0c;工龄计算、…

数据采集与预处理,前后端结合案例(有代码),Python连接MySQL,对MySQL的增删改查

Python对MySQL的增删改查 通过Python连接MySQL """连接MySQL数据库&#xff0c;并进行增删改查&#xff0c;同时查询了MySQL版本号&#xff0c;并做了动态注册的账号&#xff0c;实现过程&#xff1a;先向userinfo当中添加account、password新字段&#xff0c…