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

相关推荐
cc.ChenLy4 小时前
算法从入门到精通实战指南
算法
Jerry11 小时前
LeetCode 160. 相交链表
算法
Jerry11 小时前
LeetCode 19. 删除链表的倒数第 N 个结点
算法
金銀銅鐵11 小时前
费马小定理
python·数学·算法
技术不好的崎鸣同学13 小时前
[ACTF2020 新生赛]Exec 思路及解法
算法·安全·web安全
Full Stack Developme14 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
Jerry15 小时前
LeetCode 707. 设计链表
算法
疋瓞15 小时前
python和C++对比(1)_数据类型和数据结构
数据结构·c++·python
C语言小火车16 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序