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,以便追踪它们的位置):

java 复制代码
原始数组:[5A, 2, 3, 5B, 1]

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

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

如果保持 5A5B 前面 → 稳定 ✅

如果变成 5B5A 前面 → 不稳定 ❌

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

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

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

关键来了:

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

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

总结

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

❌ 选择排序是不稳定的!


2、执行流程

如下图所示:

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

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


3、java实现

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));
    }
}

输出结果:

java 复制代码
排序前:[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

相关推荐
PAK向日葵2 小时前
【算法导论】PDD 0817笔试题题解
算法·面试
地平线开发者4 小时前
ReID/OSNet 算法模型量化转换实践
算法·自动驾驶
地平线开发者4 小时前
开发者说|EmbodiedGen:为具身智能打造可交互3D世界生成引擎
算法·自动驾驶
星星火柴9365 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑6 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
闪电麦坤957 小时前
数据结构:迭代方法(Iteration)实现树的遍历
数据结构·二叉树·
C++、Java和Python的菜鸟8 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀8 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散1128 小时前
01数据结构-Prim算法
数据结构·算法·图论
起个昵称吧8 小时前
线程相关编程、线程间通信、互斥锁
linux·算法