选择排序算法

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

相关推荐
好学且牛逼的马2 小时前
【Hot100|21-LeetCode 160. 相交链表】
算法·leetcode
爱学习的阿磊2 小时前
C++中的策略模式应用
开发语言·c++·算法
郝学胜-神的一滴2 小时前
Python中的bisect模块:优雅处理有序序列的艺术
开发语言·数据结构·python·程序人生·算法
筵陌2 小时前
算法:位运算
算法
Christo32 小时前
TKDE-2026《Efficient Co-Clustering via Bipartite Graph Factorization》
人工智能·算法·机器学习·数据挖掘
2401_838472512 小时前
C++异常处理最佳实践
开发语言·c++·算法
m0_736919102 小时前
C++中的类型标签分发
开发语言·c++·算法
2301_790300962 小时前
C++与微服务架构
开发语言·c++·算法
重生之我是Java开发战士2 小时前
【优选算法】前缀和:一二维前缀和,寻找数组的中心下标,除自身以外数组的乘积,和为K的子数组,和可被K整除的子数组,连续数组,矩阵区域和
线性代数·算法·矩阵