嵌入式 - 数据结构与算法:(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 

相关推荐
数模竞赛Paid answer3 小时前
2026年中青杯数学建模A题数学建模论文智能评估系统与多智能体优化方法求解全过程论文及程序
算法·数学建模·中青杯
银-豆豆3 小时前
数据结构与算法-动态规划、回溯与贪心
算法·动态规划
想吃火锅10055 小时前
【leetcode】200. 岛屿数量
算法·leetcode·职场和发展
hold?fish:palm5 小时前
24 回文链表
数据结构·c++·链表
Nil2085 小时前
leetcode 54螺旋矩阵
算法·leetcode·矩阵
依然鸣6 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
qeen879 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
lucas_AI9 小时前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
冻柠檬飞冰走茶10 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
民乐团扒谱机10 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别