当前位置: 首页 > news >正文

冒泡、选择、插入排序:三大基础排序算法深度解析(C语言实现)

在算法学习道路上,排序算法是每位程序员必须掌握的基石。本文将深入解析冒泡排序、选择排序和插入排序这三种基础排序算法,通过C语言代码实现和对比分析,帮助读者彻底理解它们的差异与应用场景。

算法原理与代码实现
1. 冒泡排序(Bubble Sort)
工作原理:
通过重复比较相邻元素,将较大元素逐步"冒泡"到数组末尾。

void bubbleSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {// 交换相邻元素int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}
}


2. 选择排序(Selection Sort)
工作原理:
每次从未排序部分选择最小元素,放到已排序序列末尾。

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;}}// 交换最小元素到当前位置int temp = arr[min_idx];arr[min_idx] = arr[i];arr[i] = temp;}
}

3. 插入排序(Insertion Sort)
工作原理:
将每个元素插入到已排序序列中的正确位置。

void insertionSort(int arr[], int n) {for (int i = 1; i < n; i++) {int key = arr[i];int j = i-1;// 后移大于key的元素while (j >= 0 && arr[j] > key) {arr[j+1] = arr[j];j--;}arr[j+1] = key;  // 插入元素}
}

三大排序算法核心对比

特性冒泡排序选择排序插入排序
稳定性✅ 稳定(相同元素顺序不变)❌ 不稳定(交换改变顺序)✅ 稳定
时间复杂度平均/最坏:O(n²)
最好:O(n)
始终 O(n²)平均/最坏:O(n²)
最好:O(n)
空间复杂度O(1)O(1)O(1)
比较次数最多(每次相邻比较)中等(找最小值需遍历)最少(利用局部有序性)
交换次数最多(每次逆序都交换)最少(每轮只交换1次)中等(元素后移代替交换)
最佳场景基本有序数组交换成本高的场景小规模或基本有序数组

关键特性深度解析

1. 稳定性对比
  • 冒泡排序:通过相邻元素交换,相等元素不会交换位置,保持稳定

  • 选择排序:最小元素与远端元素交换时可能破坏稳定性

  • 插入排序:元素后移插入,相等元素相对位置不变

2. 时间复杂度分析
  • 最优情况

    • 冒泡和插入在已排序数组可达O(n)

    • 选择排序始终需要O(n²)比较

  • 最差情况

    • 三者均为O(n²),但实际性能:

    • 插入排序 > 选择排序 > 冒泡排序(逆序数组测试)

3. 空间复杂度

三者都是原地排序,仅需常数级额外空间(O(1))

http://www.dtcms.com/a/273915.html

相关文章:

  • 模型训练的常用方法及llama-factory支持的数据训练格式
  • [论文阅读] 人工智能 + 软件工程 | LLM辅助软件开发:需求如何转化为代码?
  • GPT和MBR分区
  • SLICEGPT: COMPRESS LARGE LANGUAGE MODELSBY DELETING ROWS AND COLUMNS
  • 匿名函数作递归函数引用
  • Immutable
  • MetaMask 连接其他网络,连接本地的 Anvil 区块链节点
  • 在Windows非Docker环境安装Redis的几种方法
  • pytest+yaml+allure接口自动化测试框架
  • 在 Postman 中高效生成随机环境变量的完整指南
  • 鸿蒙app 开发中的Record<string,string>的用法和含义
  • 深入探索Kafka Streams:企业级实时数据处理实践指南
  • 关闭 GitLab 升级提示的详细方法
  • AI产品经理面试宝典第8天:核心算法面试题-下
  • 蓝光三维扫描技术在汽车钣金件复杂型面测量中的应用案例
  • 重振索尼复古微型电脑——计划以OrangePi CM5 作为主板升级
  • php 如何通过mysqli操作数据库?
  • springboot生成pdf方案之dot/html/图片转pdf三种方式
  • 【实用IP查询工具】IP数据云-IP地址查询离线库使用方案
  • 【AI大模型】RAG系统组件:向量数据库(ChromaDB)
  • 《数据库》MySQL备份回复
  • 【数据库基础 1】MySQL环境部署及基本操作
  • Ntfs!NtfsCheckpointVolume函数分析之Lfcb->RestartArea的变更和什么时候RestartArea写回文件的关系
  • 两台电脑通过网线直连形成局域网,共享一台wifi网络实现上网
  • Cesium实战:交互式多边形绘制与编辑功能完全指南(最终修复版)
  • Unity3d程序运行显示debugger信息
  • c/c++拷贝函数
  • 【Qt 学习之路】Qt Android开发环境搭建:Ubuntu的Vmware虚拟机中的踩坑实录
  • Arcgis连接HGDB报错
  • python的类型注解讲解