选择排序算法

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

相关推荐
啥都想学点的研究生33 分钟前
一篇文章讲清楚:逻辑回归
算法·机器学习·逻辑回归
货拉拉技术2 小时前
Agent 场景下 Token 成本优化的实战技巧
算法
hahaha60162 小时前
HLS高层次综合设计技巧--循环merge和循环split
人工智能·算法·计算机视觉
JAI科研2 小时前
Deepseek Agent Harness教程(七) | Deepseek Harness不是一个内核加一堆插件
开发语言·人工智能·深度学习·算法·自然语言处理·transformer·vllm
positive_zpc2 小时前
进阶数据结构图——关键路径(四)
数据结构·图论·关键路径
集思广益的灰太狼2 小时前
变频器启动致PLC数据异常?西门子G120配合滤波器EMC抑制方案
人工智能·算法·工控·emc·电磁兼容·变频器·西门子
孙克旭_2 小时前
单链表进阶实操:5 道常考面试题详细解析【Java 实现】
java·开发语言·数据结构·单链表
方方洛2 小时前
vllm教程-03-架构设计
算法·架构
玄昌盛不会编程2 小时前
LeetCode——2091. 从数组中移除最大值和最小值
java·算法·leetcode
如何取名2 小时前
结合实际业务进行LRU淘汰算法优化设计(数据库开发日志)
数据库·算法