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

目录

一、选择排序的基本步骤

二、时间复杂度

三、优缺点

[四、Java 实现选择排序](#四、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 复制代码
下面是选择排序的 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 方法用于打印数组的内容,帮助展示排序结果。
测试输出

java 复制代码
原始数组:
64 25 12 22 11
排序后的数组:
11 12 22 25 64

总结

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

相关推荐
itsuifengerxing2 分钟前
python 自定义无符号右移
算法
猎板PCB厚铜专家大族32 分钟前
高频 PCB 技术发展趋势与应用解析
人工智能·算法·设计规范
dying_man43 分钟前
LeetCode--24.两两交换链表中的结点
算法·leetcode
yours_Gabriel43 分钟前
【力扣】2434.使用机器人打印字典序最小的字符串
算法·leetcode·贪心算法
草莓熊Lotso1 小时前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
KyollBM2 小时前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
CV点灯大师2 小时前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
GGBondlctrl2 小时前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想
武子康2 小时前
大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
大数据·人工智能·算法·机器学习·语言模型·spark-ml·boosting
武子康2 小时前
大数据-277 Spark MLib - 基础介绍 机器学习算法 Gradient Boosting GBDT算法原理 高效实现
大数据·人工智能·算法·机器学习·ai·spark-ml·boosting