选择排序:每轮选最小,放到前面

目标:理解选择排序每一轮如何在未排序区间中找最小值,并放到当前起点位置。

绿色 = 已排好序区间 橙色 = 本轮找到的最小值 蓝色 = 本轮起点 i

第一屏:原始数组

第二屏:课堂 selectionSort 代码(Java)

public static void selectionSort(int[] a) {
    int n = a.length;
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (a[j] < a[minIndex]) {
                minIndex = j;
            }
        }
        int temp = a[i];
        a[i] = a[minIndex];
        a[minIndex] = temp;
    }
}

第三屏:选择排序原理(通俗版)

选择排序每轮做同一件事:从“未排序区间”里选出最小值,放到这轮的起点位置 i。

第 1 步:确定起点 i 本轮目标是让下标 i 放上正确元素。
第 2 步:扫描未排序区间 从 i+1 往后找,持续更新 minIndex。
第 3 步:交换一次 把最小值换到 i,本轮完成。
第 4 步:i 向右推进 已排序区间每轮扩大 1 个元素。

一句话记忆:每轮“找最小 + 放前面”,直到倒数第二个位置。

第四屏:选择排序的特点(重点)

时间复杂度固定 O(n²) 最好、平均、最坏都差不多,因为每轮都要完整扫描未排序区间。
原地排序,空间 O(1) 只需要少量临时变量,几乎不占额外内存。
不稳定排序 交换可能让相等元素前后次序改变。
交换次数少 最多 n-1 次交换,写操作成本高的场景有时更合适。

结论:选择排序的优势是“实现简单、交换少”,弱点是“比较次数多、整体偏慢”。

第五屏:7 轮选择全过程

第六屏:最终结果 + 记忆要点

最终有序数组

3 条记忆要点