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

相关推荐
仍然.6 小时前
算法题目---BFS解决最短路问题
算法·宽度优先
渡众机器人6 小时前
第八届全球校园人工智能算法精英大赛-算法应用赛-空地协同侦排挑战赛规则
人工智能·算法
wayz117 小时前
Overlap:HWMA(Holt-Winter移动平均线)技术指标详解
算法·金融·数据分析·量化交易·特征工程
Shadow(⊙o⊙)7 小时前
专题四:前缀和
数据结构·算法
JAVA面经实录9177 小时前
高频算法面试题
java·计算机网络·算法·面试
qq_452396237 小时前
第十一篇:《资源管理:Requests/Limits、ResourceQuota、LimitRange》
算法·贪心算法
Tisfy7 小时前
LeetCode 2095.删除链表的中间节点:两次遍历 / 一次遍历(快慢指针)
算法·leetcode·链表·题解·双指针
Irissgwe7 小时前
AVL树详解
数据结构·c++·算法·二叉树·c·二叉搜索树·avl
凌波粒7 小时前
LeetCode--131.分割回文串(回溯算法)
算法·leetcode·职场和发展
北域码匠8 小时前
奇偶归并排序:并行计算的排序利器
数据结构·算法·c#·排序算法