选择排序算法

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

相关推荐
吃好睡好便好8 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅8 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue11 小时前
三角形数
笔记·算法·数论·组合数学
Mr. zhihao11 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
念何架构之路12 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星12 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑12 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光12 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩13 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_6294947313 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表