排序算法 ---选择排序(直排,堆排)(java)

2024-04-07 09:32

本文主要是介绍排序算法 ---选择排序(直排,堆排)(java),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

排序是在程序开发中常用的操作,也是个大公司面试的时候检验一个人编程能力的一个必考题,排序就是涉及到了算法了,今天下午就想着来搞一下排序的算法,算是对其有一个初步的了解吧,后天期中考了,挂科可就不是排序算法能够解决的问题了。

衡量一个算法优劣的标准:

1.时间复杂度,完成这个任务,算法所需要的时间。

2.空间复杂度,完成该任务,算法所需要的占用的内存空间,或者是所需要的外部辅助空间。

3.稳定性,完成任务后,对原始数据的影响大不大,会不会产生了一些不必要的操作,导致了原始数据发生了错误。

 现在的排序方式分为两种:1.内部排序2.外部排序

内部排序就是整个排序操作都在内存中执行不借助于外部,外部排序就是需要借助外部的存储,大多是数据量比较大的一些排序,对于外部排序常用的方式就是多路归并操作,将原始文件分成多个可以一次性装进内存的子文件,执行排序,排序后,将其输出到外部程序中。

我们所说的排序大多指的是内部排序,内部排序分为以下几类:选择排序(直接选择排序,堆排序),交换排序(冒泡排序,快速排序),插入排序(直接插入排序,折半插入排序,Sheel排序),归并排序,桶式排序,基数排序。

选择排序 

1.直接选择排序

//直接选择排序public int[] sort(int[] a) {for (int i = 0; i < a.length - 1; i++) {int max = a[i];for (int j = i + 1; j < a.length; j++) {if (a[j] > max) {max = a[j];a[j] = a[i];a[i] = max;}}}return a;}

思路:两个嵌套的for循环,通过第一个循环找到第一个元素,通过一个值记录这个元素,然后进入下一个循环,通过这个循环找到该数组中当前元素值要大的数,然后将两者的值进行交换。上面的排序中当找出来符合值之后要进行多次值的交换,比较影响程序性能的,下面这种通过记录其下标值来对较大的值做一个记录,然后最后再对其进行交换,如果数据大的话,明显的可以提升程序的性能。

 public int[] sort(int[] a) {for (int i = 0; i < a.length - 1; i++) {int index = i;for (int j = i + 1; j < a.length; j++) {if (a[j] > a[index]) {index = j;}}if(index != i){
//		不借助第三变量将连个数的值进行交换a[i] = a[index]+a[i];a[index] = a[i]- a[index];a[i] = a[i] - a[index];}}return a;}

2.堆排序

堆排序,首先就是要建堆,堆在这里又分为大顶堆和小顶堆,根据堆,堆在本质上就是一个二叉树,大顶堆就是二叉树的根节点是树中最大的值,小顶堆就是根节点为最小的二叉树,利用堆进行排序的时候,首先是将所有数据建堆,将最大数或者最小数选择出来,然后放在所有数据的最后面,然后将剩余的数据执行上一次操作。

 public void buildHeap(int [] a){for(int i = 0;i<a.length-1;i++){buildMaxHeap(a,a.length-1-i);a[0] = a[0]+a[a.length-1-i];a[a.length-1-i] =a[0]-a[a.length-1-i];a[0]=a[0]-a[a.length-1-i];}}public void buildMaxHeap (int []a,int lastIndex){for(int i = (lastIndex-1)/2 ; i >= 0 ; i--){int k = i;while(k*2+1 <= lastIndex){int biggerIndex = 2*k+1;if(biggerIndex<lastIndex){if(a[biggerIndex]<a[biggerIndex+1]){biggerIndex++;}}if(a[k]>a[biggerIndex]){a[k] = a[k]+a[biggerIndex];a[biggerIndex] = a[k] - a[biggerIndex];a[k] = a[k]-a[biggerIndex];}elsebreak;}}}

对原来的数组进行抽象化,将其抽象成一棵二叉树,数组中的首位元素是二叉树的根结点,首先我们找到该数组的最后一位元素的下标,然后建立大顶堆,找到最后一个元素的父结点,判断左右结点的大小,然后记录下数值较大的数的坐标,然后将其和其父节点进行数值上的交换,然后继续向和其父节点处在同一层的元素的大小判断,最中产生

了一个大顶堆,然后我们将这个顶端的值保存在数组的最后一个元素的位置,然后将之前的记录的最后一个位置坐标向前移动一位,然后接着进行循环。

这篇关于排序算法 ---选择排序(直排,堆排)(java)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882235

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows