Java排序算法之<选择排序>

目录

1、选择排序

1.1、介绍

1.2、稳定性

2、执行流程

3、java实现

4、优缺点


总结:Java 排序算法进阶路线

  1. O(n²) 算法(适合学习原理)

    • 冒泡排序(最慢)→ 选择排序 → 插入排序(推荐先学)

  2. O(n log n) 算法(实际应用)

    • 归并排序(稳定)→ 快速排序(最快,但不稳定)→ 堆排序(空间省)

  3. Java 内置排序

    • Arrays.sort():对基本类型用 快速排序,对象类型用 归并排序(保证稳定性)。


1、选择排序

1.1、介绍

(Selection Sort)—— 比冒泡“聪明”一点。

每一次从未排序的数据中选出最小(或最大)的元素,放到已排序序列的末尾。

就像你有一堆乱序的书,每次从中挑出最薄的一本,放到书架上,直到所有书排好序。

1.2、稳定性

稳定排序要求:所有值相同的元素,排序后必须保持它们在原数组中的先后顺序。

有这样一个数组(用 A、B 标记两个相同的 5,以便追踪它们的位置):

原始数组:[5A, 2, 3, 5B, 1]

目标是用 选择排序 把它从小到大排序。

我们要关注的是:排序后,5A 和 5B 的相对顺序是否保持不变?

如果保持 5A 在 5B 前面 → 稳定 ✅
如果变成 5B 在 5A 前面 → 不稳定 ❌

选择排序的执行过程(逐轮分析)

✅第 0 轮:在 [5A, 2, 3, 5B, 1] 中找最小值

  • 从索引 0 到 4 遍历,找出最小值是 1,它在索引 4。
  • 把 1 和 5A(索引 0)交换:
交换前:[5A, 2, 3, 5B, 1]
交换后:[1, 2, 3, 5B, 5A]

关键来了:

  • 原来的 5A 被换到了最后(索引 4)
  • 原来的 5B 还在原地(索引 3)
    👉 所以现在:5B 在索引 3,5A 在索引 4 → 5B 在 5A 前面

虽然它们的值都是 5,但 原来 5A 在前,现在 5B 在前相对顺序被改变了

总结

冒泡排序是稳定的,(因为只在 > 时才交换,== 不动)。

❌ 选择排序是不稳定的!


2、执行流程

如下图所示:

  1. 在数组 [0...n-1] 中找到最小元素,与第 0 个元素交换。
  2. 在 [1...n-1] 中找到最小元素,与第 1 个元素交换。
  3. 在 [2...n-1] 中找到最小元素,与第 2 个元素交换。
  4. … 重复直到整个数组有序。

每一轮确定一个位置的最终值。


3、java实现

public class SelectionSort {/*** 选择排序:升序* @param arr 待排序的整型数组*/public static void selectionSort(int[] arr) {// 边界判断if (arr == null || arr.length <= 1) {return;}int n = arr.length;// 外层循环:控制排序的位置(0 ~ n-2)for (int i = 0; i < n - 1; i++) {int minIndex = i; // 假设当前位置就是最小值的索引// 内层循环:在未排序部分 [i+1, n-1] 中找真正的最小值for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j; // 更新最小值的索引}}// 将找到的最小值与位置 i 的元素交换if (minIndex != i) {swap(arr, i, minIndex);}}}/*** 交换数组中两个元素*/private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}// 测试方法public static void main(String[] args) {int[] arr = {64, 25, 12, 22, 11, 90};System.out.println("排序前:" + java.util.Arrays.toString(arr));selectionSort(arr);System.out.println("排序后:" + java.util.Arrays.toString(arr));}
}

输出结果:

排序前:[64, 25, 12, 22, 11, 90]
排序后:[11, 12, 22, 25, 64, 90]


4、优缺点

🔍 和冒泡的区别:

  • 冒泡:不断交换,把最大值“冒”到最后。
  • 选择:每轮只记录最小值的下标,最后只交换一次

✅ 优点:

  • 交换次数少(最多 n-1 次),适合写操作代价高的场景(如写入闪存)。

参考文章:

1、六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序-CSDN博客文章浏览阅读10w+次,点赞6.3k次,收藏3.4w次。本文详细介绍了排序算法中的插入排序、希尔排序、选择排序、冒泡排序、堆排序以及两种快速排序方法(Hoare版本和挖坑法)。通过动图演示和代码实现,展示了这些算法的工作原理和时间复杂度,帮助读者深入理解排序算法的内部机制。 https://blog.csdn.net/weixin_50886514/article/details/119045154?ops_request_misc=%257B%2522request%255Fid%2522%253A%25220faf03d22b2d125d5f49a4649ad59c85%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=0faf03d22b2d125d5f49a4649ad59c85&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-119045154-null-null.142^v102^control&utm_term=%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4187

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

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

相关文章

ESP8266 http收发数据

1.先修改基础配置 make menuconfig 打开配置菜单 选择component config 然后选择 修改波特率为115200 保存退出 2.修改彩色日志打印的 在component config目录下找到log output 选中点击空格关掉彩色日志输出&#xff0c;这样正常串口打印就没有乱码了 然后保存退出 3…

ZLMediaKit 源代码入门

ZLMediaKit 是一个基于 C11 开发的高性能流媒体服务器框架&#xff0c;支持 RTSP、RTMP、HLS、HTTP-FLV 等协议。以下是源代码入门的详细指南&#xff1a; 1. 源码结构概览 主要目录结构&#xff1a; text ZLMediaKit/ ├── cmake/ # CMake 构建配置 ├── …

智能Agent场景实战指南 Day 21:Agent自主学习与改进机制

【智能Agent场景实战指南 Day 21】Agent自主学习与改进机制 文章内容 开篇 欢迎来到"智能Agent场景实战指南"系列的第21天&#xff01;今天我们将深入探讨智能Agent的自主学习与改进机制——这是使Agent能够持续提升性能、适应动态环境的核心能力。在真实业务场景…

微信小程序中英文切换miniprogram-i18n-plus

原生微信小程序使用 miniprogram-i18n-plus第一步&#xff1a;npm install miniprogram-i18n-plus -S安装完成后&#xff0c;会在项目文件文件夹 node_modules文件里生成 miniprogram-i18n-plus&#xff0c; 然后在工具栏-工具-构建npm&#xff0c;然后看到miniprogram_npm里面…

LeetCode 127:单词接龙

LeetCode 127&#xff1a;单词接龙问题本质&#xff1a;最短转换序列的长度 给定两个单词 beginWord 和 endWord&#xff0c;以及字典 wordList&#xff0c;要求找到从 beginWord 到 endWord 的最短转换序列&#xff08;每次转换仅改变一个字母&#xff0c;且中间单词必须在 wo…

docker搭建ray集群

1. 安装docker 已安装过docker 没安装流程 启动 Docker 服务&#xff1a; sudo systemctl start docker sudo systemctl enable docker # 设置开机即启动docker验证 Docker 是否安装成功&#xff1a; docker --version2. 部署ray # 先停止docker服务 systemctl stop docker…

【iOS】SideTable

文章目录前言1️⃣Side Table 的核心作用&#xff1a;扩展对象元数据存储1.1 传统对象的内存限制1.2 Side Table 的定位&#xff1a;集中式元数据仓库2️⃣Side Table 的底层结构与关联2.1 Side Table 与 isa 指针的关系2.2 Side Table 的存储结构2.3 SideTable 的工作流程3️⃣…

【Spring Cloud Gateway 实战系列】高级篇:服务网格集成、安全增强与全链路压测

一、服务网格集成&#xff1a;Gateway与Istio的协同作战在微服务架构向服务网格演进的过程中&#xff0c;Spring Cloud Gateway可与Istio形成互补——Gateway负责南北向流量&#xff08;客户端到集群&#xff09;的入口管理&#xff0c;Istio负责东西向流量&#xff08;集群内服…

一文说清楚Hive

Hive作为Apache Hadoop生态的核心数据仓库工具&#xff0c;其设计初衷是为熟悉SQL的用户提供大规模数据离线处理能力。以下从底层计算框架、优点、场景、注意事项及实践案例五个维度展开说明。 一、Hive底层分布式计算框架对比 Hive本身不直接执行计算&#xff0c;而是将HQL转换…

SeaweedFS深度解析(三):裸金属单机和集群部署

#作者&#xff1a;闫乾苓 文章目录2.2.4 S3 Server&#xff08;兼容 Amazon S3 的接口&#xff09;2.2.5 Weed&#xff08;命令行工具&#xff09;3、裸金属单机和集群部署3.1 裸金属单机部署3.1.1安装 SeaweedFS3.1.2 以Master模式启动2.2.4 S3 Server&#xff08;兼容 Amazon…

相机ROI 参数

相机的 ROI&#xff08;Region of Interest&#xff0c;感兴趣区域&#xff09; 参数&#xff0c;是指通过设置图像传感器上 特定区域 作为有效成像区域&#xff0c;从而只采集该区域的图像数据&#xff0c;而忽略其他部分。这一功能常用于工业相机、科研相机、高速相机等场景&…

Vue基础(24)_VueCompinent构造函数、Vue实例对象与组件实例对象

分析上一节代码中的school组件&#xff1a;该组件是一个名为VueCompinent的构造函数。截取部分vue.js源码&#xff0c;分析Vue.extend&#xff1a;// 定义一个名为VueComponent的构造函数对象Sub&#xff0c;往Sub对象调用_init(options)方法&#xff0c;参数为配置项&#xff…

萤石云替代产品摄像头方案萤石云不支持TCP本地连接-东方仙盟

不断试错东方仙盟深耕科研测评&#xff0c;聚焦前沿领域&#xff0c;以严谨标准评估成果&#xff0c;追踪技术突破&#xff0c;在探索与验证中持续精进&#xff0c;为科研发展提供参考&#xff0c;助力探路前行 萤石云价格萤石云的不便于使用 家庭场景&#xff1a;成本可控与隐…

C51:用DS1302时钟读取和设置时间

因为在ds1302.c文件中包含了写ds1302&#xff08;51向ds1302写数据&#xff09;和读ds1302&#xff08;51从ds1302读数据&#xff09;的两个函数&#xff0c;我们根据文件中提供的函数来写读取时间和设置时间的函数即可ds1302.c文件源码如下&#xff0c;需要的同学可以参考一下…

webrtc整体架构

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一套支持浏览器和移动应用进行实时音视频通信的开源技术标准&#xff0c;其架构设计围绕 “实时性”“低延迟”“跨平台” 和 “安全性” 展开&#xff0c;整体可分为核心引擎层、API 层、支撑服务层三大部分&…

浅析PCIe 6.0 ATS地址转换功能

在现代高性能计算和虚拟化系统中,地址转换(Address Translation)是一个至关重要的机制。随着 PCIe 设备(如 GPU、网卡、存储控制器)直接访问系统内存的能力增强,设备对虚拟内存的访问需求日益增长。 为了提升性能并确保安全访问,Address Translation Services(ATS) 应…

【前端】ikun-pptx编辑器前瞻问题二: pptx的压缩包结构,以及xml正文树及对应元素介绍

文章目录PPTX文件本质&#xff1a;一个压缩包核心文件解析1. 幻灯片内容文件 (ppt/slides/slideX.xml)2. 元素类型解析文本框元素 (p:sp)图片元素 (p:pic)单位系统开发注意事项参考工具pptx渲染路线图PPTX文件本质&#xff1a;一个压缩包 PPTX文件实际上是一个遵循Open XML标准…

分布式任务调度实战:XXL-JOB与Elastic-Job深度解析

告别传统定时任务的局限&#xff0c;拥抱分布式调度的强大与灵活 在现代分布式系统中&#xff0c;高效可靠的任务调度已成为系统架构的核心需求。面对传统方案&#xff08;如Timer、Quartz&#xff09;在分布式环境下的不足&#xff0c;开发者急需支持集群调度、故障转移和可视…

Windows 11下纯软件模拟虚拟机的设备模拟与虚拟化(仅终端和网络)

Windows 11下用GCC的C代码实现的虚拟机需要终端输入/输出&#xff08;如串口或虚拟控制台&#xff09;和网络连接&#xff0c;但不需要完整的硬件设备&#xff08;如磁盘、显卡、USB 等&#xff09;。在终端输入/输出方面&#xff0c;参考qemu的源代码&#xff0c;但不调用qemu…

CCF-GESP 等级考试 2025年6月认证Python六级真题解析

1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;第1题 下列哪一项不是面向对象编程&#xff08;OOP&#xff09;的基本特征&#xff1f;&#xff08; &#xff09;A. 继承 (Inheritance) B. 封装 (Encapsul…