选择排序算法

选择排序(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

相关推荐
逆境不可逃26 分钟前
【除夕篇】LeetCode 热题 100 之 189.轮转数组
java·数据结构·算法·链表
xiaoye-duck31 分钟前
《算法题讲解指南:优选算法-滑动窗口》--13 水果成篮
c++·算法
wefg132 分钟前
【算法】模运算的技巧
算法
智者知已应修善业35 分钟前
【冰雹猜想过程逆序输出】2025-4-19
c语言·c++·经验分享·笔记·算法
编程小白_澄映42 分钟前
机器学习——特征工程
人工智能·算法·机器学习
美好的事情能不能发生在我身上1 小时前
Leetcode热题100中的:哈希专题
算法·leetcode·哈希算法
wefg11 小时前
【算法】倍增思想(快速幂)
数据结构·c++·算法
Zik----1 小时前
Leetcode24 —— 两两交换链表中的节点(迭代法)
数据结构·算法·链表
SmartBrain1 小时前
通俗讲解:Agent Skill和智能体的技术概念
人工智能·算法
爱喝热水的呀哈喽1 小时前
副产品技法
算法