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

C语言:冒泡排序

#include <stdio.h>
#include <stdbool.h>  // 用于bool类型// 1. 基础版冒泡排序
void bubble_sort_basic(int arr[], int n) {// 外层循环控制排序轮次(n-1轮)for (int i = 0; i < n - 1; i++) {// 内层循环执行相邻元素比较和交换for (int j = 0; j < n - 1 - i; j++) {// 前>后则交换(升序排列)if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}// 2. 检测交换点提前终止
void bubble_sort_optimized(int arr[], int n) {for (int i = 0; i < n - 1; i++) {bool swapped = false;  // 交换标志位for (int j = 0; j < n - 1 - i; j++) {if (arr[j] > arr[j + 1]) {// 执行交换int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = true;  // 标记发生交换}}// 本轮无交换说明已有序,提前结束if (!swapped) break;}
}// 3. 边界版(动态收缩)
void bubble_sort_boundary(int arr[], int n) {int last_swap_index = 0;    // 记录最后交换位置int sort_boundary = n - 1;  // 无序区边界for (int i = 0; i < n - 1; i++) {bool swapped = false;for (int j = 0; j < sort_boundary; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = true;last_swap_index = j;  // 更新最后交换位置}}// 更新边界为最后一次交换的位置sort_boundary = last_swap_index;// 无交换则提前终止if (!swapped) break;}
}// 4. 双向冒泡排序
void bubble_sort_bidirectional(int arr[], int n) {int left = 0;                  // 左边界int right = n - 1;             // 右边界bool swapped = true;           // 交换标志while (left < right && swapped) {swapped = false;// 正向遍历(左→右):移动最大值到右侧for (int i = left; i < right; i++) {if (arr[i] > arr[i + 1]) {int temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;swapped = true;}}right--;  // 右边界收缩// 反向遍历(右→左):移动最小值到左侧for (int i = right; i > left; i--) {if (arr[i] < arr[i - 1]) {int temp = arr[i];arr[i] = arr[i - 1];arr[i - 1] = temp;swapped = true;}}left++;  // 左边界收缩}
}// 打印数组
void print_array(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int original[] = {79,45,12,3,23,64, 34, 25, 12, 22, 11, 90};int n = sizeof(original) / sizeof(original[0]);// 复制数组用于不同排序方法int arr1[n], arr2[n], arr3[n], arr4[n];for(int i = 0; i < n; i++) {arr1[i] = original[i];arr2[i] = original[i];arr3[i] = original[i];arr4[i] = original[i];}printf("原始数组: ");print_array(original, n);// 测试不同排序算法bubble_sort_basic(arr1, n);printf("基础版:   ");print_array(arr1, n);bubble_sort_optimized(arr2, n);printf("优化版:   ");print_array(arr2, n);bubble_sort_boundary(arr3, n);printf("边界优化: ");print_array(arr3, n);bubble_sort_bidirectional(arr4, n);printf("双向冒泡: ");print_array(arr4, n);return 0;
}

算法特点对比表:

算法类型时间复杂度空间复杂度优化点适用场景
基础版O(n²) 始终O(1)教学演示/小数据集
优化版(提前终止)O(n²)~O(n)O(1)检测到有序时提前终止部分有序数据
边界优化版O(n²)~O(n)O(1)动态缩小无序区边界尾部有序的大数据集
双向冒泡(鸡尾酒)O(n²)~O(n)O(1)双向交替扫描元素分布不均匀的数据集

执行结果示例:

原始数组: 79 45 12 3 23 64 34 25 12 22 11 90 
基础版:   3 11 12 12 22 23 25 34 45 64 79 90 
优化版:   3 11 12 12 22 23 25 34 45 64 79 90 
边界优化: 3 11 12 12 22 23 25 34 45 64 79 90 
双向冒泡: 3 11 12 12 22 23 25 34 45 64 79 90
http://www.xdnf.cn/news/16864.html

相关文章:

  • 【3】交互式图表制作及应用方法
  • kafka快速部署、集成、调优
  • 香港正式启动稳定币牌照制度!推动中国的人民币国际化?
  • 智能Agent场景实战指南 Day 29:Agent市场趋势与前沿技术
  • ALOcc: Adaptive Lifting-based 3D Semantic Occupancy and
  • 异步函数被调用多次,多次处理同一个文件导致占用,如何让异步函数按顺序执行?
  • 【Node.js安装注意事项】-安装路径不能有空格
  • RustFS:高性能文件存储与部署解决方案(MinIO替代方案)
  • 10.Linux 用户和组的管理
  • 【智能协同云图库】第七期:基于AI调用阿里云百炼大模型,实现AI图片编辑功能
  • Apache Flink 2.1.0: 面向实时 Data + AI 全面升级,开启智能流处理新纪元
  • webpack面试题及详细答案80题(41-60)
  • 【科研绘图系列】R语言绘制环状分组显著性柱状堆积图
  • iOS 抓不到包怎么办?全流程排查思路与替代引导
  • 机械学习中的一些优化算法(以逻辑回归实现案例来讲解)
  • 带root权限_中国移动创维DT541_S905L3融合机器改机顶盒刷机教程 当贝纯净版安卓9.0系统线刷包 刷机包
  • Git 命令使用指南:从入门到进阶
  • 字节跳动招AI for Science算法研究员(AI分子动力学)
  • 图论-最短路Floyd算法
  • GXP6040K压力传感器可应用于医疗/汽车/家电
  • 【AI 加持下的 Python 编程实战 2_12】第九章:繁琐任务的自动化(上)——自动清理电子邮件文本
  • 如何将联系人从三星手机转移到 iPhone
  • 8.1.2 TiDB存储引擎的原理
  • Git 各场景使用方法总结
  • LT3045EDD#TRPBF ADI亚德诺半导体 线性稳压器 电源管理应用设计
  • Spark Shuffle性能优化实践指南:提升大数据处理效率
  • 通过CISSP考试,共答到第127题
  • PendingIntent的flag和原理解析
  • CMake set_source_files_properties使用解析
  • Day17--二叉树--654. 最大二叉树,617. 合并二叉树,700. 二叉搜索树中的搜索,98. 验证二叉搜索树