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

目录

一、选择排序的基本步骤

二、时间复杂度

三、优缺点

[四、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)) 的时间复杂度,在处理大数据时效率较低。为了提高性能,在实际应用中通常会选择更高效的排序算法,如快速排序、归并排序等。

相关推荐
未来之窗软件服务5 小时前
自己写算法(九)网页数字动画函数——东方仙盟化神期
前端·javascript·算法·仙盟创梦ide·东方仙盟·东方仙盟算法
豐儀麟阁贵6 小时前
基本数据类型
java·算法
乐迪信息7 小时前
乐迪信息:基于AI算法的煤矿作业人员安全规范智能监测与预警系统
大数据·人工智能·算法·安全·视觉检测·推荐算法
hsjkdhs8 小时前
C++之多层继承、多源继承、菱形继承
开发语言·c++·算法
立志成为大牛的小牛8 小时前
数据结构——十七、线索二叉树找前驱与后继(王道408)
数据结构·笔记·学习·程序人生·考研·算法
星空下的曙光8 小时前
Node.js crypto模块所有 API 详解 + 常用 API + 使用场景
算法·node.js·哈希算法
Algo-hx8 小时前
数据结构入门 (七):从“链接”到“分支” —— 初探树与二叉树
数据结构
小贾要学习9 小时前
【数据结构】C++实现红黑树
数据结构·c++
StarPrayers.10 小时前
旅行商问题(TSP)(2)(heuristics.py)(TSP 的两种贪心启发式算法实现)
前端·人工智能·python·算法·pycharm·启发式算法
爱吃橘的橘猫10 小时前
嵌入式系统与嵌入式 C 语言(2)
c语言·算法·嵌入式