当前位置: 首页 > news >正文

java算法:选择排序

文章标题

  • 概述与基本实现
  • 优缺点
  • 尝试优化

概述与基本实现

选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是每次从待排序的元素中选择最小(或最大)的元素,放置在已排序的部分的末尾,直到所有元素都排序完成。

实现步骤:

  • 遍历数组,将当前位置作为最小值的索引(假设为minIndex)。
  • 在未排序部分中遍历数组,从当前位置开始,找到最小值的索引。
  • 将最小值与当前位置的元素交换位置。这样,最小值将会被放置在已排序部分的末尾。
  • 重复步骤2和3,直到整个数组排序完成。
public class SelectionSort {public static void selectionSort(int[] arr) {int n = arr.length;// 遍历数组for (int i = 0; i < n - 1; i++) {int minIndex = i; // 当前位置作为最小值的索引// 在未排序部分找到最小值的索引for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}// 将最小值与当前位置的元素交换位置int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}}public static void main(String[] args) {int[] arr = {64, 25, 12, 22, 11};System.out.println("原始数组: " + Arrays.toString(arr));selectionSort(arr);System.out.println("排序后数组: " + Arrays.toString(arr));}
}

通过选择排序算法,数组按升序进行了排序。在每次循环中,选择排序会找到未排序部分的最小值,并将其放置在已排序部分的末尾,直到整个数组排序完成。选择排序的时间复杂度为O(n^2),其中n是数组的大小。

优缺点

优点:

  • 简单直观:选择排序算法的实现相对简单,容易理解和实现。
  • 不占用额外空间:选择排序算法是在原地进行排序的,不需要额外的辅助空间。
  • 稳定性:选择排序是一种稳定的排序算法,不会改变相等元素的相对顺序。

缺点:

  • 时间复杂度:选择排序的时间复杂度为O(n^2),其中n是数组的大小。在最坏情况下,无论输入数据的顺序如何,都需要进行n*(n-1)/2次比较和n次交换操作。
  • 不适用于大规模数据:由于选择排序的时间复杂度较高,它在处理大规模数据时效率较低,不如其他高效的排序算法(如快速排序、归并排序等)。
  • 不稳定的选择性:尽管选择排序是一种稳定的排序算法,但在选择最小值的过程中,交换操作可能会打破相等元素的相对顺序,导致不稳定性。

选择排序算法在简单性和稳定性方面具有一些优点,但在时间复杂度和适用性上存在一些缺点。对于小规模的数据或者对稳定性要求较高的场景,选择排序可能是一个合适的选择。然而,对于大规模数据或对性能有较高要求的情况,其他更高效的排序算法通常更合适。

尝试优化

选择排序算法在简单性和稳定性方面具有一些优点,但在时间复杂度和适用性上存在一些缺点。对于小规模的数据或者对稳定性要求较高的场景,选择排序可能是一个合适的选择。然而,对于大规模数据或对性能有较高要求的情况,其他更高效的排序算法通常更合适。

优化选择排序的方法:

  • 最小值和最大值同时查找:传统的选择排序算法会先找到最小值的索引,然后进行交换。但实际上,在同一次遍历中,可以同时找到最小值和最大值的索引,然后进行两个位置的交换。这样可以减少一半的比较次数。
  • 减少交换次数:传统的选择排序算法在找到最小值或最大值后会立即进行交换。但可以优化为先记录最小值(或最大值)的索引,然后在一次遍历结束后再进行交换。这样可以减少交换的次数。

示例代码:

public class SelectionSort {public static void selectionSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;int maxIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;} else if (arr[j] > arr[maxIndex]) {maxIndex = j;}}// 将最小值交换到已排序部分的开头if (minIndex != i) {int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}// 如果最大值的索引发生了交换,重新调整最大值的索引if (maxIndex == i) {maxIndex = minIndex;}// 将最大值交换到已排序部分的末尾if (maxIndex != n - 1) {int temp = arr[maxIndex];arr[maxIndex] = arr[n - 1];arr[n - 1] = temp;}n--; // 已排序部分增加一个元素,未排序部分减少一个元素}}public static void main(String[] args) {int[] arr = {64, 25, 12, 22, 11};System.out.println("原始数组: " + Arrays.toString(arr));selectionSort(arr);System.out.println("排序后数组: " + Arrays.toString(arr));}
}

通过同时查找最小值和最大值的索引,并在一次遍历结束后进行交换,可以减少比较和交换的次数。这样的优化可以稍微提高选择排序的性能。

需要注意的是,尽管选择排序经过优化,但其时间复杂度仍然是O(n^2),并不适用于大规模数据。对于更高效的排序算法,如快速排序、归并排序等,可以考虑使用它们来取代选择排序。

相关文章:

  • Linux之网络编程
  • JAVA系列---函数式接口
  • 图像的几何变换之平移
  • 【数据挖掘-思考】分类和聚类
  • Java基础面试重点-1
  • 【java计算机专业毕设】月度员工绩效考核管理系统java MySQL springboot vue maven代码源码 送文档
  • Opus从入门到精通(四)Opus解码程序实现
  • 【CT】LeetCode手撕—102. 二叉树的层序遍历
  • 如何查看当前的gruop_id 的kafka 消费情况 这个可以查看到是否存在消费阻塞问题
  • 记录:UA_Client_readValueAttribute 读取失败 C0错误码
  • RabbitMQ延迟消息(通过死信交换机实现)
  • 电子画册制作与传统画册相比,有哪些优势?
  • nc网络收发测试-tcp客户端\TCP服务器\UDP\UDP广播
  • 仿element-ui 实现自己组件库 <3>
  • 前端 JS 经典:Vue 状态仓库持久化
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • AWS实战 - 利用IAM对S3做访问控制
  • CentOS7简单部署NFS
  • GraphQL学习过程应该是这样的
  • Javascript弹出层-初探
  • JS题目及答案整理
  • JS学习笔记——闭包
  • PHP 7 修改了什么呢 -- 2
  • Python进阶细节
  • Python学习之路16-使用API
  • React-Native - 收藏集 - 掘金
  • springMvc学习笔记(2)
  • vue-cli3搭建项目
  • windows下mongoDB的环境配置
  • 代理模式
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端存储 - localStorage
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 鱼骨图 - 如何绘制?
  • 再次简单明了总结flex布局,一看就懂...
  • 找一份好的前端工作,起点很重要
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • puppet连载22:define用法
  • ​configparser --- 配置文件解析器​
  • ​zookeeper集群配置与启动
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #includecmath
  • (19)夹钳(用于送货)
  • (AngularJS)Angular 控制器之间通信初探
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (四) 虚拟摄像头vivi体验
  • (转)Mysql的优化设置
  • (转)Oracle存储过程编写经验和优化措施