嵌入式 - 数据结构与算法:(1-11)排序算法 - 选择排序(Selection Sort)

上一篇 下一篇
冒泡排序

目 录


2)选择排序(Selection Sort)

选择排序是一种简单直观的比较排序算法

2.1)核心思想

每次从未排序的部分中选出最小(或最大)的元素,将其与未排序部分的第一个元素交换位置,从而逐步构建有序序列。

整个数组被分为两部分:

  • 左侧:已排序(初始为空)
  • 右侧:未排序(初始为整个数组)

每轮从右侧选出最小值,放到左侧末尾。

2.2)算法步骤(升序)

  1. 在 arr[0...n-1] 中找到最小元素,与 arr[0] 交换;
  2. 在 arr[1...n-1] 中找到最小元素,与 arr[1] 交换;
  3. 重复上述过程,直到第 n-2 轮(最后一个元素自然有序);
  4. 排序完成。

注意:即使当前元素已经是最小值,也会"和自己交换"------但可通过判断避免无意义交换(非必须)。

2.3)时间与空间复杂度

情况 时间复杂度(始终为O(n²))
最好 O(n²)
平均 O(n²)
最坏 O(n²)
  • 空间复杂度:O(1)(原地排序)
  • 稳定性:❌ 不稳定
    • 举例:[5, 5, 2] → 第一个 5 会和 2 交换,导致两个 5 的相对顺序改变。
  • 交换次数:最多 n−1 次(比冒泡少很多)

2.4)C 语言代码示例

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

/**
 * @brief:		selection_sort ------ 选择排序函数(升序)
 * @note:		n - 输入数组长度
 */
void selection_sort(int arr[], int n) 
{
    for (int i = 0; i < n - 1; i++) 
    {
        int min_index = i; // 假设当前 i 是最小值的位置

        // 在未排序部分 [i+1, n-1] 中找最小值
        for (int j = i + 1; j < n; j++) 
        {
            if (arr[j] < arr[min_index])
                min_index = j;
        }

        // 如果最小值不在 i 位置,则交换
        if (min_index != i) 
        {
            int temp = arr[i];
            arr[i] = arr[min_index];
            arr[min_index] = temp;
        }
    }
}

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

/* 主函数:测试选择排序 */
int main() 
{
    int arr[] = {64, 25, 12, 22, 11, 90, 34};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("原始数组: ");
    print_array(arr, n);

    selection_sort(arr, n);

    printf("排序后数组: ");
    print_array(arr, n);

    return 0;
}

运行结果如下:

复制代码
原始数组: 64 25 12 22 11 90 34 
排序后数组: 11 12 22 25 34 64 90 

相关推荐
Navigator_Z1 小时前
LeetCode //C - 1293. Shortest Path in a Grid with Obstacles Elimination
c语言·算法·leetcode
Nil2081 小时前
leetcode 64最小路径和
算法·leetcode·职场和发展
光影少年1 小时前
AI Agent、自动化与未来工作
人工智能·算法·架构
牧羊人.3332 小时前
计算机视觉基础 第16章|EigenFace,FisherFace,LBPH传统人脸识别算法
人工智能·算法·计算机视觉
jeo陽2 小时前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构
Nil2082 小时前
leetcode 72编辑距离
算法·leetcode·职场和发展
神工坊2 小时前
技术分享︱SIMFORGE HSF® 网格加密与热点加速技术实践
算法·hpc·网格·cae·工程仿真·数值引擎·samr
CV@CV3 小时前
世界模型与智能体协同推理逻辑
人工智能·算法·边缘计算·量子计算·具身智能
jiayoushijie-泽宣3 小时前
SHIFT-PathFormer:专家轨迹蒸馏、连续安全优化与超大迷宫实验
算法
slandarer3 小时前
MATLAB | 趣味编程——动态字符串甜甜圈和爱心
数据结构·matlab·趣味编程