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

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.dtcms.com/a/310379.html

相关文章:

  • VUE:学习路径
  • 机器学习:开启智能时代的钥匙
  • 前端学习日记(十七)
  • Unity3D制作UI动画效果
  • treeshaking,webpack,vite
  • 技术为核,口碑为盾:普瑞眼科成都市场“卷王”地位的形成逻辑
  • Canny边缘检测算法-个人记录
  • 计数组合学7.10(舒尔函数的组合定义)
  • 图片搜索1688的商品技术实现:API接口item_search_img
  • 嵌入式——C语言:俄罗斯方块
  • C#常见的转义字符
  • 国产开源大模型崛起:使用Kimi K2/Qwen2/GLM-4.5搭建编程助手
  • 浏览器渲染过程
  • VSCode Python 与 C++ 联合调试配置指南
  • web前端第一次作业
  • TwinCAT3编程入门2
  • 如何快速给PDF加书签--保姆级教程
  • TCP协议的特点和首部格式
  • 电力系统与变压器实验知识全总结 | 有功无功、同步发电机、短路空载实验、电压调整率、效率条件全讲透!
  • curl命令使用
  • 蒙特卡罗方法(Monte Carlo Method)_学习笔记
  • 【面板数据】全国31省名义、实际GDP及GDP平减指数数据(2000-2024年)
  • VR拍摄的流程与商业应用,实用的VR拍摄技巧
  • 汇川ITS7100E触摸屏交互界面开发(二)界面开发软件使用记录
  • python试卷01
  • Cesium性能优化
  • 代码随想录刷题Day22
  • 如何利用API接口与网页爬虫协同进行电商平台商品数据采集?
  • Java应用服务器选型指南:WebLogic vs. Tomcat、WebSphere、JBoss/Wildfly
  • 今日行情明日机会——20250801