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

相关推荐
careathers11 小时前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
H.莓飛11 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla11 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
tellmewhoisi12 小时前
深度学习0:数学知识:正态分布1
人工智能·深度学习·算法
-梅12 小时前
算法(1) 动态规划
算法·动态规划
青少儿编程课堂12 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:Bellman-Ford与SPFA含负权最短路及负环检测全解析
c++·python·算法·bfs·信息学竞赛
octopus_c13 小时前
STL 之 string:auto 与范围 for、常用接口、模拟实现与深浅拷贝
开发语言·c++·算法
老师我太想进步了20261 天前
【数据结构-4】算法美学之顺序表
数据结构·算法
风影同志783241 天前
编码器是激活函数吗?—— 一个看起来很像、其实不是的类比
算法
UIU1141 天前
P1481 魔族密码
c++·算法·动态规划