C语言---排序算法2---选择排序法

文章目录

算法原理

选择排序是一种基于比较的简单排序算法,其核心思想是:

1、每次从未排序部分选择最小(或最大)元素。

2、将其放到已排序部分的末尾。

3、重复上述过程,直到所有元素有序。

代码实现

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

// 选择排序函数
void selectionSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) { // 外层循环控制已排序部分的末尾
        int min_idx = i; // 假设当前位置为最小值索引
        
        // 内层循环寻找未排序部分的最小值
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[min_idx]) {
                min_idx = j; // 更新最小值索引
            }
        }
        
        // 将最小值交换到已排序部分的末尾
        if (min_idx != i) { // 避免不必要的交换
            int temp = arr[i];
            arr[i] = arr[min_idx];
            arr[min_idx] = temp;
        }
    }
}

// 测试代码
int main() {
    int arr[] = {64, 25, 12, 22, 11};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    selectionSort(arr, n);
    printf("排序结果: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

执行过程示例

以数组 5, 2, 9, 1, 5 为例:

bash 复制代码
初始数组: [5, 2, 9, 1, 5]
第1轮: 
  - 找到最小值 1(索引 3),交换到位置 0 → [1, 2, 9, 5, 5]
第2轮: 
  - 剩余部分 [2, 9, 5, 5],最小值 2(索引 1),无需交换 → [1, 2, 9, 5, 5]
第3轮: 
  - 剩余部分 [9, 5, 5],最小值 5(索引 3),交换到位置 2 → [1, 2, 5, 9, 5]
第4轮: 
  - 剩余部分 [9, 5],最小值 5(索引 4),交换到位置 3 → [1, 2, 5, 5, 9]

特点

原地排序:仅需常数级额外空间(O(1))。

不稳定排序:相同元素的相对位置可能改变(如 5, 5, 2 中第一个 5 会被交换到后面)。

时间复杂度:始终为 O(n²)(无论输入是否有序)。

优缺点对比

优点 缺点
实现简单,代码直观 时间复杂度始终为 O(n²)
交换次数少(最多 n-1 次) 不适合大规模数据排序
空间复杂度低(O(1)) 不稳定排序(可能改变相同元素顺序)

适用场景

1、小规模数据排序(如 n < 1000)。

2、内存受限环境(如嵌入式系统)。

3、教学示例(理解排序算法的基本思想)。

相关推荐
大明者省1 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
WWJA王文举2 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
白狐_7983 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2583 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记3 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
qq_448011164 小时前
C语言中的动态内存分配
c语言·开发语言·php
杨航 AI4 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型4 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
动词ing4 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习
旖旎夜光4 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口