选择排序:简单算法的实现与优化探索

devtools/2024/12/26 12:17:53/

目录

一、选择排序的基本步骤

二、时间复杂度

三、优缺点

四、Java 实现选择排序

总结


选择排序是一种简单直观的排序算法。它的基本思想是每次从未排序的部分中选择最小(或最大)元素,将其放到已排序部分的末尾。尽管选择排序的时间复杂度较高,但其实现简洁,适合小规模数据的排序。

一、选择排序的基本步骤

(1)初始状态:将待排序序列分成已排序和未排序两部分,开始时已排序部分为空,未排序部分包含所有元素。
(2)遍历未排序部分:从未排序部分中找出最小(或最大)元素。
(3)交换位置:将最小(或最大)元素与未排序部分的第一个元素交换。
(4)重复步骤 2 和 3,直到所有元素都在已排序部分。

二、时间复杂度

(1)时间复杂度:无论输入数据如何,选择排序总是需要 (O(n^2)) 的时间。每次找最小值需要扫描一次未排序部分,这需要 (n-1) 次比较,接着是 (n-2) 次比较,以此类推,因此总共需要 (O(n^2)) 的比较次数。
(2)空间复杂度:选择排序是原地排序(in-place),只需要常数的额外空间,所以空间复杂度为 (O(1))。

三、优缺点

优点:

(1)实现简单,易于理解。
(2)是原地排序算法,不需要额外的内存空间。

缺点:

(1)时间复杂度高,不适合大规模数据的排序。
(2)不稳定排序(即相等的元素顺序可能会被改变)。

四、Java 实现选择排序

下面是选择排序的 Java 实现代码:
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; // 更新最小值索引
}
}// 如果最小元素不在当前位置,交换它们
if (minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}// 打印数组
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}public static void main(String[] args) {
int[] arr = {64, 25, 12, 22, 11};System.out.println("原始数组:");
printArray(arr);selectionSort(arr);System.out.println("排序后的数组:");
printArray(arr);
}
}

代码解析
(1)选择排序函数:selectionSort 方法实现了选择排序的核心逻辑。它使用两层循环:
(2)外层循环 (for loop) 遍历所有的元素,将每个元素放到正确的位置。
(3)内层循环用来在未排序的部分找到最小的元素,并更新 minIndex。
(4)交换:在内层循环结束后,检查最小元素的位置是否是当前遍历的位置。如果不是,则交换两个元素的位置。
(5)打印数组:printArray 方法用于打印数组的内容,帮助展示排序结果。
测试输出

原始数组:
64 25 12 22 11
排序后的数组:
11 12 22 25 64

总结

选择排序是一种易于理解且实现简单的排序算法,适合小规模数据的排序。然而,由于其 (O(n^2)) 的时间复杂度,在处理大数据时效率较低。为了提高性能,在实际应用中通常会选择更高效的排序算法,如快速排序、归并排序等。


http://www.ppmy.cn/devtools/145524.html

相关文章

2.利用docker进行gitlab服务器迁移

一、Docker安装 安装Ubuntu 22.04.3 LTS \n \l 1、旧版本安装包清理 sudo apt-get remove docker docker-engine docker.io containerd runc当你卸载Docker时,存储在/var/lib/docker/中的图像、容器、卷和网络不会自动删除。如果你想从一个干净的安装开始&#x…

Leecode刷题C语言之切蛋糕的最小总开销①

执行结果:通过 执行用时和内存消耗如下: int idx(int m, int n, int row1, int col1, int row2, int col2) {return (row1 * n col1) * m * n row2 * n col2; }int dp(int m, int n, int row1, int col1, int row2, int col2, int *horizontalCut, int *vertica…

JVM系列(十二) -常用调优命令汇总

最近对 JVM 技术知识进行了重新整理,再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…

如何进行POC概念验证

进行 POC(Proof of Concept,概念验证) 的目的是验证某个想法、技术或方案的可行性。以下是进行 POC 的详细步骤: 1. 明确目标和范围 定义问题:明确你要解决的核心问题或验证的关键点。 设定目标:确定 POC …

(Python+selenium)UI自动化测试详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 我们在进行UI自动化测试时,一般采用javaselenium或者pythonselenium的方式。由于python比较简单,上手快,因此建议大家采用pyt…

basic_ios及其衍生库(附 GCC libstdc++源代码)

basic_ios及其衍生库(附 GCC libstdc源代码) 我们由这张图展开我们的讨论 对于Date对象&#xff0c;只有实现了<<重载到输出流才可以插入到stringstream ss中 现在我有疑问stringstream是怎么做到既能输出又能输入的&#xff1f; 而且为什么stringstream对象能传给ostre…

3.银河麒麟V10 离线安装Nginx

1. 下载nginx离线安装包 前往官网下载离线压缩包 2. 下载3个依赖 openssl依赖&#xff0c;前往 官网下载 pcre2依赖下载&#xff0c;前往Git下载 zlib依赖下载&#xff0c;前往Git下载 下载完成后完整的包如下&#xff1a; 如果网速下载不到请使用网盘下载 通过网盘分享的文件…

全国硕士研究生入学考试(考研)常识详解之复试考试科目:笔试、面试与加试

全国硕士研究生入学考试&#xff08;考研&#xff09;常识详解之复试考试科目&#xff1a;笔试、面试与加试 硕士研究生入学考试的复试是对考生进行全面评估的重要环节&#xff0c;旨在考察考生的专业知识、综合素质及科研潜力。复试主要包括笔试与面试两大核心部分&#xff0…