Java:七大基于比较的排序算法——上(思想+代码实现 超详细!)

冒泡排序、堆排序、插入排序、归并排序、快速排序、选择排序、希尔排序


目录

一、冒泡排序

1、基本思想

2、特征总结

3、代码实现

二、堆排序

1、基本思想

2、特征总结

3、代码实现

三、插入排序

1、基本思想

2、特征总结

3、代码实现

四、选择排序

1、基本思想

2、特征总结

3、代码实现

五、希尔排序

1、基本思想

2、特征总结

3、代码实现


一、冒泡排序

1、基本思想

        比较相邻的两个元素,如果前者比后者大,就交换他们两个。这样每一趟排序下来都可以确定一个最大元素。(这里以升序排序为例)

2、特征总结

冒泡排序是最简单,也是最容易理解的排序。

时间复杂度:O(N^2)

空间复杂度:O(1)

稳定性:稳定

3、代码实现

(包含完整冒泡排序代码 与 n次冒泡排序代码)

public class Bubble_Sort {//完整的冒泡排序public static void bubbleSort(int[] array) {//其中:i指的是元素排序的次数 j指的是参与排序的元素个数//为什么每次要减i?// 因为每排序一次,末尾都是数组中最大的元素,为了减少时间复杂度,末尾元素不参与排序for (int i = 0; i < array.length - 1; i++) {for (int j = 0; j < array.length - i - 1; j++) {boolean flag = true;//如果后面的元素比前面的大,就交换两个元素if(array[j] > array[j+1]) {int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;flag = false;}//元素不再交换了,证明排序已经完成了 可以提前结束循环if(!flag) {break;}}}}//冒泡排序n次public static void bubbleSortIndex(int[] array, int index) {for (int i = 0; i < index; i++) {for (int j = 0; j < array.length - i - 1; j++) {//如果后面的元素比前面的大,就交换两个元素if(array[j] > array[j+1]) {int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;}}}}
}

二、堆排序

1、基本思想

        堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。

        需要注意的是排升序要建大堆,排降序建小堆。

2、特征总结

再次强调:升序要建大根堆,降序要建小根堆!

时间复杂度:O(N*logN)

空间复杂度:O(1)

稳定性:不稳定

3、代码实现

要进行升序排序,需要建立大根堆

public class Heap_Sort {//向下调整建立大根堆public static void siftDown(int[] array,int parent,int len) {int child = (2*parent)+1;while(child < len) {if(child+1 < len && array[child+1] > array[child]) {child++;}if(array[child] > array[parent]) {swap(array,child,parent);parent = child;child = (2*parent)+1;} else {break;}}}public static void swap(int[] array,int x,int y) {int tmp = array[x];array[x] = array[y];array[y] = tmp;}public static void creatBigheap(int[] array) {int parent = (array.length-1-1) / 2;for (int i = parent; i >= 0; i--) {siftDown(array,i, array.length);}}public static void heapSort(int[] array) {int end = array.length - 1;while(end > 0) {swap(array,0,end);siftDown(array,0,end-1);end--;}}public static void main(String[] args) {int[] arr = {1,3,5,7,9,2,4,6,8};//先建立大根堆creatBigheap(arr);System.out.print("堆排序前:");System.out.println(Arrays.toString(arr));//而后进行堆排序,使其变为升序排序System.out.print("堆排序后:");heapSort(arr);System.out.println(Arrays.toString(arr));}
}

运行结果:


三、插入排序

1、基本思想

        把待排序的元素按其大小逐个插入到已经排序好的有序序列中,直到所有的元素都插入完成为止,这样子就可以得到一个有序序列。

(可以理解称为我们玩斗地主时,每拿一张牌,就在原本的牌序列中找到合适的位置将新的牌插入。)

2、特征总结

时间复杂度:O(N^2)       

                   (元素有序时 —— O(N)        元素逆序时 —— O(N^2)   )

空间复杂度:O(1)

稳定性:稳定

特点:插入排序越趋于有序,算法的时间效率越高。

3、代码实现

public class Insert_Sort {public static void insertSort(int[] array) {for (int i = 0; i < array.length; i++) {int j = i - 1;int tmp = array[i];for (; j >= 0 ; j--) {//如果比tmp大 就证明不是升序的 要往后挪动if(array[j] > tmp) {array[j+1] = array[j];} else {break;}}/*当走到这一步有两种情况:1、j<0  (0 - i-1)的元素都遍历一遍了 要把tmp放到j+1的位置填充上2、j前面的元素都比tmp小了 要把tmp放回j+1的位置*/array[j+1] = tmp;}}
}


四、选择排序

1、基本思想

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

2、特征总结

直接选择排序思想上很好理解,但是运行效率不够高。

时间复杂度:O(N^2)

空间复杂度:O(1)

稳定性:不稳定

3、代码实现

public class Select_Sort {public static void selectSort(int[] array) {for (int i = 0; i < array.length; i++) {int minIndex = i;for (int j = i+1; j < array.length; j++) {if(array[j] < array[minIndex]) {minIndex = j;}}swap(array,i,minIndex);}}public static void swap(int[] array,int x,int y) {int tmp = array[x];array[x] = array[y];array[y] = tmp;}
}

五、希尔排序

1、基本思想

        希尔排序的基本思想是:先选定一个整数,把待排序序列中的所有元素分成多个组,把所有距离相同的元素放在同一组内,并对每一组内的元素进行排序。一直重复上述过程,当组与组间的距离到达1时,再排序一次,所有的元素就排好序了。

2、特征总结

希尔排序是对直接插入排序的优化。当gap > 1 时,都是预排序,当 gap == 1 时,序列已经趋近于有序了。
时间复杂度:希尔排序的时间复杂度不好计算,与gap的取值方式密切相关。因此很多书中给出的时间复杂度都不相同:

空间复杂度:O(1)

稳定性:不稳定

3、代码实现

public class Shell_Sort {public static void shellSort(int[] array) {int gap = array.length;while(gap > 1) {gap = gap / 3 + 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 -= gap) {if(array[j] > tmp) {array[j+gap] = array[j];} else {break;}}array[j+gap] = tmp;}}
}

以上就是 Java:七大基于比较的排序算法——上(思想+代码实现 超详细!),希望能对你有所帮助!

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

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

相关文章

带宽的理解-笔记

带宽的理解 带宽(频带宽度)&#xff1a;是指电磁波最高频率和最低频率的差值&#xff0c;这一段频率被称为带宽。 举例说明 人耳能听到的频率范围是20赫兹到2万赫兹。换句话说&#xff0c;人而只对20赫兹至2万赫兹的声音频率有反应&#xff0c;超出或低于这一频率范围的声音我…

上市企业数字赋能指数数据集-2001到2022年(TF-IDF)

01、数据简介 上市公司数字赋能指数是一个用来衡量上市公司利用数字技术提高业务能力和效率的指标。这个指数反映了上市公司利用大数据、云计算和人工智能等数字技术&#xff0c;高效地利用商业资源和信息&#xff0c;并扩展供应关系的能力。市公司数字赋能指数是一种综合性的…

小米汽车充电枪继电器信号

继电器型号&#xff1a; 参考链接 小米SU7&#xff0c;便捷充放电枪拆解 (qq.com)https://mp.weixin.qq.com/s?__bizMzU5ODA2NDg4OQ&mid2247486086&idx1&sn0dd4e7c9f7c72d10ea1c9f506faabfcc&chksmfe48a110c93f2806f6e000f6dc6b67569f6e504220bec14654ccce7d…

基于Spring Boot的家具销售电商平台设计与实现

基于Spring Boot的家具销售电商平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首页…

PDF 正确指定页码后,挂载的书签页码对不上

这个问题与我的另一篇中方法一样 如何让一个大几千页的打开巨慢的 PDF 秒开-CSDN博客 https://blog.csdn.net/u013669912/article/details/138166922 另作一篇的原因 一篇文章附带一个与该文章主题不相关的问题时&#xff0c;不利于被遇到该问题的人快速搜索发现以解决其遇到…

JavaScript基础(二)

JS语法结构——引入方式 js很明显可以是一个后缀名为js的文件&#xff0c;js的引入方式和css一样&#xff0c;也有三种方式。 1.外部 使用script表现&#xff0c;只不过增加一个src属性&#xff0c;把js文件的路径src属性中。 <script src "js文件路径">&l…

查看笔记本电池容量/健康状态

1. 打开命令行提示符 快捷键“win R”后输入“cmd” 2. 在命令提示符中输入命令 “powercfg /batteryreport" 并回车 3. 查看文件 最后就可以看到笔记本的电池使用报告了

[华为OD] C卷 5G网络 现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站 200

题目 现需要在某城市进行5G网络建设&#xff0c;已经选取N个地点设置5G基站&#xff0c;编号固定为1到N,接 下来需要各个基站之间使用光纤进行连接以确保基站能互联互通&#xff0c;不同基站之间架设光纤的成 本各不相同&#xff0c;且有些节点之间已经存在光纤相连&#…

mongodb使用debezium

前置 服务器上需要安装jdk11 jdk下载地址 kafka安装 官网下载地址 安装教程 debezium 安装 运行 Debezium 连接器需要 Java 11 或更高版本 Debezium 并不是一个独立的软件&#xff0c;而是很多个 Kafka 连接器的总称。这些 Kafka 连接器分别对应不同的数据库&#xff0c;…

十一、大模型-Semantic Kernel与 LangChain 的对比

Semantic Kernel 与 LangChain 的对比 Semantic Kernel 和 LangChain 都是用于开发基于大型语言模型&#xff08;LLM&#xff09;的应用程序的框架&#xff0c;但它们各有特点和优势。 基本概念和目标 Semantic Kernel 是一个由微软开发的轻量级 SDK&#xff0c;旨在帮助开发…

uniapp 自定义 App启动图

由于uniapp默认的启动界面太过普通 所以需要自定义个启动图 普通的图片不可以过不了苹果的审核 所以使用storyboard启动图 生成 storyboard 的网站&#xff1a;初雪云-提供一站式App上传发布解决方案

短视频素材哪个App最好?短视频素材哪里有免费的?

在数字媒体的黄金时代&#xff0c;富有创意的视频内容已成为吸引观众的关键。高质量的视频素材不仅能增强视觉效果&#xff0c;还能提升整体叙述的力度。以下列出了一系列全球顶尖的视频素材提供网站&#xff0c;它们将为你的广告制作、社交媒体或任何视频项目提供极具影响力的…

C++浮点数format时的舍入问题

C浮点数format时的舍入问题 首先有这样一段代码&#xff1a; #include <iostream> #include <stdio.h> using namespace std;int main() {cout << " main begin : " << endl;printf("%.0f \r\n", 1.5);printf("%.0f \r\n&…

jenkins教程

jenkins 一、简介二、下载安装三、配置jdk、maven和SSH四、部署微服务 一、简介 Jenkins是一个流行的开源自动化服务器&#xff0c;用于自动化软件开发过程中的构建、测试和部署任务。它提供了一个可扩展的插件生态系统&#xff0c;支持各种编程语言和工具。 Jenkins是一款开…

ROM修改进阶教程------如何去除安卓机型系统的开机向导 几种操作步骤解析

在和很多工作室定制化系统中。手机在第一次启动的时候系统都会进入设置向导,虽然可以设置手机的基本配置。但有很多客户需要去除手机的开机向导来缩短开机时间。确保手机直接进入工作状态。那么今天的教程针去除对开机向导的几种方法做个解析。机型很多版本不同。操作也有不同…

ENVI下遥感积雪面积信息的提取

积雪是气温、降水变化的最敏感的指示因子之一&#xff0c;ENVI为积雪面积信息的提取提供了多种技术方法 光谱统计学方法 光谱统计学提取积雪面积信息主要利用感兴趣区域ROI&#xff08;样本&#xff09;的选择&#xff0c;利用传统的监督方法实现。 决策树方法 决策树方法提取…

《HCIP-openEuler实验指导手册》1.7 Apache虚拟主机配置

知识点 配置步骤 需求 域名访问目录test1.com/home/source/test1test2.com/home/source/test2test3.com/home/source/test3 创建配置文件 touch /etc/httpd/conf.d/vhost.conf vim /etc/httpd/conf.d/vhost.conf文件内容如下 <VirtualHost *.81> ServerName test1.c…

翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二

合集 ChatGPT 通过图形化的方式来理解 Transformer 架构 翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习一翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深…

阿里云开源大模型开发环境搭建

ModelScope是阿里云通义千问开源的大模型开发者社区&#xff0c;本文主要描述AI大模型开发环境的搭建。 如上所示&#xff0c;安装ModelScope大模型基础库开发框架的命令行参数&#xff0c;使用清华大学提供的镜像地址 如上所示&#xff0c;在JetBrains PyCharm的项目工程终端控…

2024深圳杯数学建模竞赛D题(东三省数学建模竞赛D题):建立非均质音板振动模型与参数识别模型

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓&#xff08;浏览器打开&#xff09; https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 2024深圳杯数学建模竞赛D题&#xff08;东三省数学建模竞赛D题&#xff0…