【算法篇】八种内排序算法

常用的八种内排序算法分别是:

  1. 交换排序:冒泡排序、快速排序
  2. 选择排序:简单选择排序、堆排序
  3. 插入排序:直接插入排序、希尔排序
  4. 归并排序
  5. 基数排序

内排序巧记:选(选择)舰(简单选择)队(堆)的时候脚(交换)毛(冒泡)快(快速),需要把轨(归并)迹(基数)擦(插入)仔(直接插入)细(希尔)

一、算法的概念和编码实现(Java)

1、冒泡排序

冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序

代码实现(升序)

	public static void selectSort(int[] array) {int len = array.length;boolean flag = true;for (int i = 0; i < len - 1 && flag; i++) {flag = false;for (int j = 0; j < len - i - 1; j++) {if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;flag = true;}}}}

 

最好情况的时间复杂度最坏情况的时间复杂度特点稳定性
T(n)=O(n)T(n)=O(n2)如果数据已经排序好,一次都不交换或者交换次数很少,效率很高;如果是完全逆序,则要不停的两两交换,效率很低稳定

2、简单选择排序

简单选择排序的基本思想是,每一趟从待排序的数据元素中选择一个最小(或者最大)的元素作为首元素,直到所有元素排完为止。

代码实现(升序):

	public static void selectSort(int[] array) {int len = array.length;for (int i = 0; i < len-1; i++) {int min = i;// 每趟排序默认第一个元素是最小的元素,记住下标for (int j = i + 1; j < len; j++) {// 从i+1的位置开始,依次同最小元素比较,若比最小元素小,则记住当前下标if (array[j] < array[min]) {min = j;}}// 无序区最小元素同无序区的第一个元素交换if (min != i) {int temp = array[min];array[min] = array[i];array[i] = temp;}}}
时间复杂度特点稳定性
T(n)=O(n2)简单,相对于冒泡排序来说交换次数少不稳定

3、直接插入排序

直接插入排序基本思想是不断将无序区的元素插入到有序区的适当位置,直到无序区没有元素排完为止

代码实现(升序):

	private static void insertSort(int[] array) {for (int i = 1; i < array.length; i++) {int j ;int temp = array[i];for (j = i; j>0 && temp < array[j-1]; j--) {array[j] = array[j-1];}array[j] = temp;}}

 

最好情况的时间复杂度最坏情况的时间复杂度特点稳定性
T(n)=O(n)T(n)=O(n2)简单稳定

4、快速排序

对冒泡排序的一种改进,它的思想是:将元素分为两组,一组的元素比另外一组的所有元素都要小,然后再按照此方法对两组元素进行排序。

快速排序我这里就不写了,快速排序相对于前面三种排序方式来说要复杂很多,看了一些博客,发现写得都不怎么样,这里推荐一个讲快速排序的视频https://www.bilibili.com/video/av39519566/?redirectFrom=h5

附上代码实现(参考视频中的):

public static void quickSort(int[] arr,int left,int right){//如果左边索引比右边索引更大或者相等,直接使用return结束这个方法if(left >= right){return;}//定义变量保存基准数int base = arr[left];//定义变量i,指向最左边int i = left;//定义变量j,指向最右边int j = right;//当i和j不相遇的时候,在循环中进行检索while(i!=j){//先由j从右向左检索比基准数小的就停下,否则继续检索while(arr[j]>=base && i<j){j--;}//在由i从左向右检索比基准数大的就停下,否则继续检索while(arr[i]<=base && i<j){i++;}//代码走到这里,i停下了,j也停下了,然后交换i和j位置的元素int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//交换基准数和相遇位置的元素arr[left] = arr[i];arr[i] = base;//排基准数左边的quickSort(arr,left,i-1);//排基准数右边的quickSort(arr,j+1,right);}
最好情况的时间复杂度最坏情况的时间复杂度平均时间复杂度特点稳定性
T(n)=O(nlogn)T(n)=O(n2)T(n)=O(nlogn)较复杂不稳定

5、希尔排序

希尔排序是对直接插入排序的优化,原理是:将数据按照步长dk分为dk个子列,然后再对每个子列运用直接插入排序。

当步长为5的时候,分组情况如下:

 

每个子列排好序后,变成:

代码实现(升序):

	public static void main(String[] args) {int[] array = {49,38,65,97,76,13,27,49,55,4};print(array);ShellSort(array,5);print(array);ShellSort(array,3);print(array);ShellSort(array,1);print(array);}private static void print(int[] array){for (int i = 0; i < array.length; i++) {System.out.print(array[i]+"\t");}System.out.println("\n");}//希尔排序,dk表示步长private static void ShellSort(int[] array,int dk) {for(int k = 0;k<dk;k++){//每个子组做直接插入插入排序for(int i = dk+k;i<array.length;){int j ;int temp = array[i];for (j = i; j-dk>=0 && temp < array[j-dk]; ) {j -= dk;//上一个元素的索引需要减去dk,而不是减1array[j] = array[j-dk];}array[j] = temp;i += dk;//下一个元素索引加上dk,而不是加1}}}

说明:从代码层面来看,希尔排序相对于直接插入排序的不同点在于希尔排序外层多了一层循环,用来将原序列分层若干个子列。内部的直接插入排序做减减或者加加时要改成减去步长或者加上步长

二、时间复杂度和空间复杂度分析

排序的稳定性:根据关键字相同(如果数值比较的话是指大小)的记录排序前后相对位置的变化,可以分为稳定性排序算法和不稳定性排序算法。在排序的序列中,如果存在两个记录Ri和Rj,其关键字分别为Ki和Kj,并且i<=j,Ki=Kj,即记录Ri在Rj之前,排序完成后,如果记录Ri和Rj的相对位置不发生改变,那么该算法是稳定性排序,否则是不稳定排序。

排序方法时间复杂度(最坏情况)空间复杂度(辅助空间)稳定性复杂性
简单选择排序O(n2)O(1)不稳定简单
冒泡排序O(n2)O(1)稳定简单
快速排序O(n2) 不稳定较复杂
直接插入排序O(n2)O(1)稳定简单
希尔排序O(n2)O(1)不稳定较复杂

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

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

相关文章

数据分析专题报告范文6篇_小学生看图写话范文:小熊玩跷跷板?(6篇),让孩子参考练习...

​范文01&#xff1a;小熊跷跷板一天&#xff0c;天气晴朗&#xff0c;胖乎乎的小熊和小白兔一起玩跷跷板。小熊一屁股坐在地上&#xff0c;小白兔说&#xff1a;“啊&#xff01;我有恐高症哇&#xff01;”小熊说&#xff1a;“我比你重&#xff0c;所以你没有办法把我翘起来…

win10环境安装使用svn客户端和服务端

一、下载安装包 安装包下载传送门http://subversion.apache.org/packages.html 无法下载的童鞋去百度云下载 链接&#xff1a;https://pan.baidu.com/s/1EuGohoZKIPmRvynp5-Subw 提取码&#xff1a;ohna 链接&#xff1a;https://pan.baidu.com/s/1EJrd5DzGCBE4rRfdhuno6Q …

所选元素非联通_非固化橡胶沥青防水涂料与耐根穿刺防水卷材(沥青基)施工要点...

目前&#xff0c;非固化复合耐根穿刺防水卷材在车库顶板的应用逐渐受到客户及用户的认可&#xff0c;也有不少慕名而来的防水从业者打电话来咨询此系统的应用情况及优势。下面就由小编来给大家系统介绍此应用系统的特点吧。01性能优势1.两种材料高度的相容性非固化橡胶沥青防水…

【Java中级篇】动态代理机制

要想搞明白动态代理之前&#xff0c;我们先来了解一下代理是什么意思&#xff0c;先来谈谈设计模式中的代理模式。 什么是代理模式&#xff08;Proxy&#xff09; 定义&#xff1a;给目标对象提供一个代理对象&#xff0c;并由代理对象控制对目标对象的引用。 在代理模式中&…

什么叫大数据人物画像_大数据时代,如何构建精准用户画像,直击精细化运营...

移动互联网时代&#xff0c;精细化运营逐渐成为企业发展的重要竞争力&#xff0c;“用户画像”的概念也应运而生。用户画像是指&#xff0c;在大数据时代&#xff0c;企业通过对海量数据信息进行清洗、聚类、分析&#xff0c;将数据抽象成标签&#xff0c;再利用这些标签将用户…

【Java中级篇】使用itextpdf生成PDF

我们可以发现很多求职网站都会将我们录入的信息来生成一个PDF简历文件。所以我这里提供了用itextpdf生成的PDF的代码。 一、步骤 1.1、使用Adobe Acrobat Pro工具编辑PDF模板 1.2、根据PDF模板文件路径创建一个PDFReader对象 1.3、创建一个输出流对象&#xff0c;用于存放生…

adb bugreport保存位置_adb 常用命令---日常提升效率

做为 Android 开发&#xff0c;怎么能不懂点 adb 命令呢&#xff1f;速看~adb 重置、断连的状况这里不说了&#xff0c;先来说一些直观的命令吧1、adb devices查看当前连接的设备如果当前正在连接着设备&#xff0c;那么就可以进行后续的操作了&#xff0c;如果没有&#xff0c…

jsp springmvc 视图解析器_Java面试题整理——SpringMVC

SpringMVC1、什么是SpringMVCSpring MVC是一个MVC的开源框架&#xff0c;Spring MVC Struts2spring&#xff0c;Spring MVC就相当于是Struts2加上Spring的整合&#xff0c;但是这里有一疑惑是Spring MVC和Spring是什么样的关系呢。Spring MVC是Spring的一个后续产品&#xff0…

采集标签_分流器(二):灵活分流能力,数据采集无忧

数据采集分析难怎么办&#xff1f;昨天和大家分享了数据采集分析的最佳助手——分流器的一些基础知识&#xff0c;回顾链接&#xff0c;今天继续和您分享第二篇&#xff0c;带您更深入地了解分流器的强大功能。业务难点在网络安全和数据可视化趋势推动下&#xff0c;企业安全分…

用友邮件撤回怎么操作_用户体验原则——“操作可控”

对于用户的误操作&#xff0c;提供二次确认或者撤销的功能&#xff0c;这样可提高用户的操作可控性。好设计应该是值得信任&#xff0c;也容易被相信的。在要求用户执行某一动作时&#xff0c;尽量帮他们理解为什么这个操作是必要的。每一步都需要借助诚实和清晰的表述来建立信…

蛋白结构建模与优化_最终幻想: 无中生有的蛋白质从头设计

作者简介: 刘源 北京大学化学与分子工程学院/力文所零.导读近几年&#xff0c;蛋白质结构预测领域连续取得重大突破。首先是【AlphaFold】&#xff0c;在可以充分利用共进化信息结合深度神经网络生成空间约束条件并降低相空间的搜索&#xff0c;极大地帮助了蛋白质的结构建模&a…

gcn在图像上的应用_每日摘要|基于CNN 特征的图像卷积网络识别杂草和作物

文章信息标题&#xff1a;CNN feature based graph convolutional network for weed and crop recognition in smart farming期刊&#xff1a;《 Computers and Electronics in Agriculture》第一单位&#xff1a;山东农业大学在线日期&#xff1a;2020-05-13Highlights1.提出了…

安卓超过两行就加省略号_基础标点符号使用规则详解—8.省略号

省略号省略号&#xff0c;是标点符号家族中的比较特殊的一个符号&#xff0c;它是由六个小圆点组成。省略号的用法不止省略文字的作用。它还有以下几种用法。1用法一(一)表示重复词语或列举的省略。例&#xff1a;1、果园里有桃树、梨树、杏树、枇杷树……真的是种类齐全。2、那…

kafka 脚本发送_Kafka笔记归纳(第五部分:一致性保证,消息重复消费场景及解决方式)...

写在开头&#xff1a;本章是Kafka学习归纳第五部分&#xff0c;着重于强调Kafka的事一致性保证&#xff0c;消息重复消费场景及解决方式&#xff0c;记录偏移量的主题&#xff0c;延时队列的知识点。文章内容输出来源&#xff1a;拉勾教育大数据高薪训练营。一致性保证水位标记…

eclipse debug 工程源码时出现source not found问题解决

问题描述&#xff1a;使用eclipse debug启动应用&#xff0c;并且打断点在工程的源码上面&#xff0c;提示source not found。 问题解决&#xff1a; 1、选中工程&#xff0c;右键Debug As》Debug Configurations 2、在Java Application下面选中需要debug的程序&#xff0c;然…

代码中有个get是啥意思_是时候秀一波了,甩掉get和set,Lombok让代码更简洁

前言前几天有个新来的同事(实习生)惊讶的对我说&#xff1a;我们的代码里好多错误&#xff0c;我的程序本地都启动不了。我一脸懵逼的质问他&#xff1a;目前线上的代码&#xff0c;怎么会有问题吗&#xff1f;他不服气的说&#xff1a;你来看嘛&#xff0c;就是有问题&#xf…

JavaWeb工程师知识图谱

一个工作快三年的的Java菜鸟&#xff0c;总结梳理了一下JavaWeb工程师必须掌握的一些知识点&#xff08;持续更新中。。。&#xff09;。 预览效果 xmind原始文件 百度云盘 链接&#xff1a;https://pan.baidu.com/s/1hp3MWGOX2I8APw75Suu52Q 提取码&#xff1a;j6w6

松下a6伺服x4接线图_2021中山东凤松下温控器回收价高同行

2021中山东凤松下温控器回收价高同行西门子TDC&#xff0c;西门子存储卡,西门子变频器等全线西门子自动化产品。小汪 满意的价格&#xff0c;快的付款速度&#xff0c;热诚欢迎全国各地朋友洽谈合作。具体回收业务&#xff1a;SIEMENS可编程控制器 1、SIMATIC&#xff0c;S7系列…

eclipse启动发生Failed to load JNI shared library

今天启动eclipse发生下面的情况 从网上知道是eclipse和jdk位数不一致导致的。 输入java -version ,查看JDK是多少位&#xff0c;显示64位的就是64位JDK&#xff0c;未显示的为32位的JDK。 eclipse的安装目录下有一个叫eclipse.ini的配置文件&#xff0c;打开后能看到 x86_64说…

5条件筛选功能_一分钟,彻底学会Excel高级筛选,坐等升职加薪!

Excel中高级筛选是普通筛选的加强&#xff0c;能够实现更加复杂的筛选功能。请您看下面的示例图&#xff1a;数据示例图如果要求筛选出班级为2班且语文成绩大于100分的数据&#xff0c;那么使用普通筛选连续筛选两次就可以得到结果。请您看下面的操作演示&#xff1a;普通筛选操…