选择排序算法

选择排序(Selection Sort)是一种简单直观的排序算法。它的核心思想非常直接:在未排序的序列中不断寻找最小(或最大)元素,将其放到已排序序列的末尾

举例:

我们以升序排序数组 [64, 25, 12, 22, 11] 为例:

  1. 第1趟排序
    • [64, 25, 12, 22, 11] 中找到最小值 11
    • 11 与未排序区首元素 64 交换。
    • 结果:[11, 25, 12, 22, 64]
  2. 第2趟排序
    • 在剩余未排序部分 [25, 12, 22, 64] 中找到最小值 12
    • 12 与未排序区首元素 25 交换。
    • 结果:[11, 12, 25, 22, 64]
  3. 第3趟排序
    • 在剩余未排序部分 [25, 22, 64] 中找到最小值 22
    • 22 与未排序区首元素 25 交换。
    • 结果:[11, 12, 22, 25, 64]
  4. 第4趟排序
    • 在剩余未排序部分 [25, 64] 中找到最小值 25
    • 25 位置不变(或者与自己交换)。
    • 结果:[11, 12, 22, 25, 64]
  5. 结束 :最后一个元素 64 自动归位,排序完成

代码实现:

cpp 复制代码
#include <stdio.h>

// 交换两个元素的值
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 选择排序主函数
void selectionSort(int arr[], int n) {
    // i 代表已排序区间的边界,也是未排序区的起始位置
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i; // 假设当前位置 i 的元素是最小的
        
        // 在未排序区间 [i+1, n-1] 中寻找真正的最小值
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j; // 更新最小值的索引
            }
        }
        
        // 将找到的最小值与未排序区的第一个元素交换
        if (minIndex != i) {
            swap(&arr[i], &arr[minIndex]);
        }
    }
}

// 打印数组
void printArray(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 测试代码
int main() {
    int data[] = {64, 25, 12, 22, 11};
    int n = sizeof(data) / sizeof(data[0]);

    printf("原始数组: ");
    printArray(data, n);

    selectionSort(data, n);

    printf("排序后数组: ");
    printArray(data, n);

    return 0;
}

算法优化策略:

标准的选择排序每次只能确定一个最小值。我们可以对其进行优化:在每一轮遍历中,同时找出未排序区间的最大值和最小值,分别放到当前区间的左右两端。这样可以在理论上将遍历次数减少一半。

关键注意点 :如果最大值恰好在未排序区间的起始位置(即最小值要交换到的位置),那么在交换最小值后,最大值的位置会发生改变,需要特殊处理更新 maxIndex

相关推荐
阳明山水4 小时前
校准分位数驱动智能库存决策
人工智能·深度学习·算法·机器学习·架构
雨落在了我的手上5 小时前
Java数据结构(十四):Map和Set
数据结构
码行山野赴时序归途5 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
别动我齐刘海6 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人
zhangfeng11336 小时前
《从“人工适配“到“智能生成“:KernelSwift 跨国产芯片算子迁移全栈方案解读》 —— 强调范式跃迁和跨硬件属性,适合偏架构分析的写法
人工智能·算法·华为·ai编程·npu
0+1116 小时前
算法 --滑动窗口
c++·算法·leetcode
reikocao6 小时前
大场景下 Hessian 特征值放大与退化检测
算法
hetao17338377 小时前
2026-09-18 hetao1733837 的刷题记录
c++·算法
wuyk5557 小时前
21.计数排序:不用比较的“空间换时间”排序算法
python·算法·排序算法
船厂电气自动化ai大模型7 小时前
AI大模型与数学|第81天 课程:正交向量、正交基、格拉姆‑施密特(Gram‑Schmidt)正交化
开发语言·数据结构·人工智能·线性代数·机器学习