java 选择排序,涵盖工作原理、算法分析、实现细节、优缺点以及一些实际应用场景

news/2024/12/17 0:49:36/文章来源:https://www.cnblogs.com/HQING/p/18611372

选择排序的详细解析
更深入地探讨选择排序的各个方面,包括其工作原理、算法分析、实现细节、优缺点以及一些实际应用场景。

动画演示

 


1. 基本概念
选择排序是一种简单的比较排序算法。它的核心思想是将数组分为两个部分:已排序部分和未排序部分。每一轮从未排序部分找到最小(或最大)元素,并将其放到已排序部分的末尾。

2. 工作原理
初始化:整个数组都被视为未排序部分。
迭代过程:
从未排序部分中选出最小元素。
将最小元素与未排序部分的第一个元素交换。
已排序部分增加一个元素,未排序部分减少一个元素。
3. 详细步骤
考虑一个数组 arr,假设其长度为 n。

第 1 轮:

在 arr[0] 到 arr[n-1] 中找最小值,假设找到的最小值在位置 minIndex。
交换 arr[0] 和 arr[minIndex]。
已排序部分:[arr[0]],未排序部分:[arr[1], arr[2], ..., arr[n-1]]。
第 2 轮:

在 arr[1] 到 arr[n-1] 中找最小值,假设找到的最小值在位置 minIndex。
交换 arr[1] 和 arr[minIndex]。
已排序部分:[arr[0], arr[1]],未排序部分:[arr[2], ..., arr[n-1]]。
继续:重复以上过程,直到未排序部分为空。

4. 伪代码
function selectionSort(array):
n = length(array)
for i from 0 to n - 1:
minIndex = i
for j from i + 1 to n - 1:
if array[j] < array[minIndex]:
minIndex = j
if minIndex != i:
swap(array[i], array[minIndex])

5. Java 实现

public class SelectionSort {public static void selectionSort(int[] array) {
int n = array.length;for (int i = 0; i < n - 1; i++) {
int minIndex = i; // 假设当前元素为最小值
for (int j = i + 1; j < n; j++) {
if (array[j] < array[minIndex]) {
minIndex = j; // 更新最小值的索引
}
}
// 如果最小值的索引变化了,则交换
if (minIndex != i) {
swap(array, i, minIndex);
}
}
}// 交换数组中两个元素的方法
private static void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}// 测试选择排序
public static void main(String[] args) {
int[] array = {64, 25, 12, 22, 11};
selectionSort(array);
System.out.println("排序后的数组:");
for (int num : array) {
System.out.print(num + " ");
}
}
}

 

6. 复杂度分析
时间复杂度:

最坏情况:(O(n^2)),每次外层循环运行 n - 1 次,内层循环运行的次数依次为 n - 1, n - 2, …, 1。
最好情况:(O(n^2)),无论数组是正序还是逆序,选择排序的比较次数都是固定的。
平均情况:(O(n^2))。
空间复杂度:选择排序是原地排序,额外空间复杂度为 (O(1))。

7. 稳定性
选择排序是一种不稳定的排序算法。原因在于,当算法寻找最小值并交换时,相同值的元素可能会改变相对位置。例如,如果有两个相同的元素,后一个可能会被前一个覆盖。

8. 优缺点
优点:

实现简单,容易理解。
不需要额外的存储空间,适合内存受限的环境。
缺点:

时间复杂度高,适合小规模数据排序。
不稳定排序,可能改变相同元素的相对顺序。
9. 实际应用
选择排序在实际应用中并不常用,因其效率较低。然而,它在以下情况中仍然有一定的应用价值:

小规模数据排序:当数据量较小时,选择排序的简单性可以使其成为一种合适的选择。
教学目的:选择排序常用于教学,以帮助学生理解排序算法的基本原理。
10. 总结
选择排序是一种基础的排序算法,适合用于小规模数据的排序。尽管它的效率不如快速排序、归并排序等高级算法,但其简单性和易于实现的特性仍然让它在一些场合下具有使用价值。理解选择排序的工作原理,为学习更复杂的排序算法奠定了基础。

更多资源推荐:
http://sj.ysok.net/jydoraemon 提取码:JYAM
实用优质资源/教程公众号【纪元A梦】

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

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

相关文章

云浮知识付费系统课程数据

本文将深入探讨在线教育与知识付费行业的现状与发展趋势,并以实际数据和案例加以说明,特别关注教育和软件行业所面对的机遇和挑战。文章将以专业知识背景和技术应用为导向,展示在线学习平台如何在提高效率和实现个性化教育方面扮演关键角色。图源 www.tuzhi.ltd随着互联网和…

【Java脚本】如何在java程序中调用python脚本

以python代码来实现将pdf文档转换为word文档为例,我们想要在Java程序中调用Python脚本,并实现文件的传递与返回,可以采用以下几种方法: 1.使用ProcessBuilder或Runtime.getRuntime().exec() Java可以通过ProcessBuilder或Runtime.getRuntime().exec()来启动一个外部进程,因…

java 冒泡排序,涵盖背景、算法步骤、代码示例、复杂度分析、优化方式及其优缺点

冒泡排序的背景知识冒泡排序是一种简单的排序算法,由于其简单易懂的特点,它通常被用作教学目的。冒泡排序在最坏情况下的效率并不高,但在某些特定条件下,它的表现可以相对较好。下面是更深入的细节。 动画演示1. 算法步骤详解1.1 基本逻辑冒泡排序的核心逻辑是比较和交换。…

【DA梦数据库系列】SQL注入小记

一、判断DMSQL二、基础语法2.1 注释2.2 常用运算符三、函数特性3.1 进制转换3.2 字符串截取3.3 字符串拼接3.4 其他四、SQLi 获取数据4.1 基本信息4.2 查询全局变量4.3 查询系统表4.4 查询视图五、联合查询注入六、报错注入6.1 除0错误6.2 溢出错误七、布尔盲注八、时间盲注九、…

ABC384E题通过历程

在赛时的时候,我们写出了一份非常牛逼的代码: # include <bits/stdc++.h> using namespace std; #define int long long const int N = 510; int a[N][N]; int vis[N][N]; struct node {bool operator()(int a, int b) {return a > b;} }; int dx[] = {0,1,-1,0}; i…

java学习12.16

springboot+vue3前后端分离的新技术的大部分写项目时的明显bug已经找到问题并纠正,可以赶上旧技术的进度了。再写几个项目就能在速度上超越旧的技术。

11CSS属性-颜色表示-chrome调试-浏览器渲染

一、今日内容 首先对这些属性进行一个演练 想要深刻理解所有常用的CSS属性,最好先学会以下几个最基础最常用的CSS属性font-size 文字大小 color前景色(文字颜色) background-color背景色 width宽度 height高度二、对CSS常用属性进行演练 1、字体的默认大小是16px的还可以看到…

使用win10 wsl子系统将 rust 程序静态编译为linux可执行文件

chapter Ⅰ 事情起因 最近在学习rust, 想把一部分java服务迁移至rust编写,但由于公司服务器都是linux系统,所以在找windows下交叉编译为linux可执行文件的方法,把bing首页搜索的结果试了个遍都不行, 始终报错“musl-gcc”无法找到,搜遍全网都无法解决。 最终在我不断尝试的…

Spring Cloud 负载均衡配置 (@LoadBalanced)

一、负载均衡 目前是两种 Ribbon 和 spring-cloud-loadbalancer - Ribbon已经闭源 配置策略较多 :轮询,随机,权重,自定义 四种负载均衡方案 配置方式yml 注解- spring-cloud-loadbalancer属于springcloud,项目兼容性更好 配置策略: 更注重 自定义(默认为轮询) 配置方式注…

架构信息收集

引子:一个Web应用的构成,由诸多组件&服务相结合,而域名仅是处于Web架构中最表层的一部分。本篇则由表及里,依次对整个Web应用架构,所需收集的信息类型、收集方式等进行介绍。附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 2.2 架构…

x86指令集 字节大小

x86指令集 字节大小 https://bbs.kanxue.com/thread-190127.htm 最近对x86_32架构下的许多程序进行了指令长度统计,结果表明所有程序所涉及的指令长度范围均为:1~11字节。而根据INTEL 开发者手册上介绍的指令的最大长度限制为15字节。但是,在什么情况或者架构上才会有12~15字…

实际项目中不一样的《桥接模式》

图片缩略图功能 需要对图片生产缩略图,压缩并保存到不同的介质中。输入端可能是本地图片,也可能是网络图片。保存的位置可能是本地,也有可能是第三方的minio、阿里云oss、七牛云oss。并且这些途径可能随时扩展。为了设计的灵活性,这里就要把输入可输出抽象出来,应用层通过…