选择排序笔记

文章目录

核心思想

选择排序是一种简单的 原地比较排序算法 ,其核心思想是:
每次从未排序部分选择最小(或最大)元素,放到已排序部分的末尾

快速排序基础版

javascript 复制代码
public class SelectSort{
  public static void selectSort(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;
        }
      }
      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;
  }
}

时间复杂度

  • 最好/最坏/平均情况均为 O(n²)(每次必须扫描剩余未排序部分)。
  • 比较次数:n(n-1)/2 次,与输入数据无关。

空间复杂度O(1)(原地排序)。

稳定性不稳定(交换可能破坏相等元素的相对顺序)。

补充:为什么选择排序不稳定?

示例:

原始数组 5₁, 2, 5₂, 1(5₁ 和 5₂ 是值相同的两个元素)。

第一轮选择最小元素 1,与 5₁ 交换 → 1, 2, 5₂, 5₁

此时 5₂ 跑到了 5₁ 前面,相对顺序改变。

根本原因:

交换操作可能跨越多个位置,破坏相等元素的原始顺序。

快速排序优化版

思路(同时找最大和最小)

基础版就是每次在未排序的数中选一个最小的放到左边已排序的末尾,而优化版的快速排序就是每次不仅把最小的放到左边,也把最大的放到右边,减少遍历次数,这里的实现要结合双指针

javascript 复制代码
public class OptimizedSelectionSort{
  public static void optimizedSelectionSort(int[] arr){
    int left = 0, right = arr.length - 1;
    while(left < right){
      int minIndex = left;
      int maxIndex = right;
      // 1. 找到当前未排序部分的最小和最大值索引
      for(int i = left; i <= right; i++){
        if(arr[i] < arr[minIndex]) minIndex = i;
        if(arr[i] > arr[maxIndex]) maxIndex = i;
      }
    }

    swap(arr, left, minIndex);
    // 注意:如果最大值原本在left位置,它可能被换到minIndex位置
    if(maxIndex == left){
      maxIndex = minIndex;
    }

    swap(arr, right, maxIndex);
  }
} 
  • 每轮同时找到最小和最大值,减少总轮数(从 n 轮减少到 n/2 轮)。
相关推荐
To_OC3 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
腻害兔3 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
2401_841495643 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
爱刷碗的苏泓舒7 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
维天说8 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19949 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端