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

冒泡排序的多种实现方式详解

引言

冒泡排序是最基础的排序算法之一,它的核心思想是通过相邻元素的比较和交换,将较大的元素逐步"冒泡"到数组的末尾。今天我们来分析三种不同的冒泡排序实现方式,每种都有其独特之处。

目录

引言

算法基础

方法一:基础冒泡排序

代码解析

特点分析

方法二:优化版冒泡排序

代码解析

特点分析

方法三:指针版冒泡排序

代码解析

特点分析

补充(指针版冒泡排序)

三种方法对比

总结


算法基础

冒泡排序的基本原理很简单:重复遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作重复进行,直到没有再需要交换的元素,这意味着该数列已经排序完成。

时间复杂度:

  • 最坏情况:O(n²)

  • 最好情况:O(n) - 优化后

  • 平均情况:O(n²)

空间复杂度:O(1)

方法一:基础冒泡排序

int main()
{int a[] = { 2,1,5,7,3,9,0,4,6,8 };int temp = 0;int n = sizeof(a) / sizeof(a[0]);printf("%d\n",n);for (int i = 0; i < n-1; i++){for (int j = 0; j < n - 1 - i; j++){if ( a[j] > a[j+1] ){temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}}for (int k = 0; k < n; k++){printf("%d ", a[k]);}printf("\n");return 0;
}

代码解析

  1. 数组初始化int a[] = { 2,1,5,7,3,9,0,4,6,8 }; 创建待排序数组

  2. 计算数组长度int n = sizeof(a) / sizeof(a[0]); 通过总字节数除以单个元素字节数得到元素个数

  3. 双重循环结构

    • 外层循环控制排序轮数:for (int i = 0; i < n-1; i++)

    • 内层循环进行相邻元素比较:for (int j = 0; j < n - 1 - i; j++)

  4. 元素交换:使用临时变量temp完成两个元素的交换

特点分析

优点

  • 代码简洁明了,易于理解

  • 逻辑清晰,是学习排序算法的入门首选

缺点

  • 没有优化,即使数组已经有序也会继续执行完整排序过程

  • 效率较低,无法提前结束

方法二:优化版冒泡排序

int main()
{int a[] = { 2,1,5,7,3,9,0,4,6,8 };int temp = 0, falg = 0;int n = sizeof(a) / sizeof(a[0]);printf("%d\n", n);for (int i = 0; i < n - 1; i++){int flag = 1; // 假设这趟已经有序了for (int j = 0; j < n - 1 - i; j++){if (a[j] > a[j + 1]){flag = 0; // 发生交换就说明,无序temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}if (flag == 1) // 这一趟没交换就说明已经有序了,后续无需排序了{break;}}for (int k = 0; k < n; k++){printf("%d ", a[k]);}printf("\n");return 0;
}

代码解析

这个版本在基础版本上增加了一个重要的优化:提前终止机制

  1. 标志变量int flag = 1; 在每轮排序开始前假设数组已经有序

  2. 交换检测:当发生元素交换时,flag = 0; 标记数组仍无序

  3. 提前终止:如果一轮排序后flag仍为1,说明没有发生交换,数组已有序,直接退出循环

特点分析

优化效果

  • 对于已经有序或接近有序的数组,效率大幅提升

  • 最好情况下时间复杂度从O(n²)降低到O(n)

实际应用价值
这种优化在实际应用中非常有价值,因为很多场景下数据可能已经部分有序。

方法三:指针版冒泡排序

int main()
{int a[] = { 2,1,5,7,3,9,0,4,6,8 };int* p = a;int temp = 0, falg = 0;int n = sizeof(a) / sizeof(a[0]);printf("%d\n", n);for (int i = 0; i < n - 1; i++){p = a; // 每趟开始时重置指针到数组开头for (int j = 0; j < n - 1 - i; j++){if (*p > *(p+1)){temp = *p;*p = *(p + 1);*(p + 1) = temp;}p++; // 指针后移}}for (int k = 0; k < n; k++){printf("%d ", a[k]);}printf("\n");return 0;
}

代码解析

这个版本使用指针操作代替数组下标,展示了C语言指针的强大功能。

  1. 指针初始化int* p = a; 指针p指向数组首地址

  2. 指针比较if (*p > *(p+1)) 使用指针解引用比较元素值

  3. 指针交换:通过指针直接操作内存完成元素交换

  4. 指针移动p++ 使指针指向下一个元素

特点分析

技术特点

  • 展示了指针在数组操作中的应用

  • 代码执行效率可能略有提升(依赖编译器优化)

  • 更接近底层内存操作

学习价值
对于理解C语言指针和内存管理很有帮助,是进阶学习的良好示例。

补充(指针版冒泡排序)

int main()
{int a[] = { 2,1,5,7,3,9,0,4,6,8 };int* p = a;int temp = 0, falg = 0;  // 注意:这里有个拼写错误,应该是flagint n = sizeof(a) / sizeof(a[0]);printf("%d\n", n);for (int i = 0; i < n - 1; i++){int flag = 1;  // 每轮开始前假设数组已有序p = a;  // 重置指针到数组开头for (int j = 0; j < n - 1 - i; j++){if (*p > *(p+1))  // 使用指针比较相邻元素{flag = 0;  // 发生交换,标记为无序temp = *p;*p = *(p + 1);*(p + 1) = temp;}p++;  // 指针移动到下一个元素}if (flag == 1)  // 如果本轮没有发生交换{break;  // 提前结束排序}}for (int k = 0; k < n; k++){printf("%d ", a[k]);}printf("\n");return 0;
}

三种方法对比

特性方法一方法二方法三
代码复杂度简单中等中等
执行效率稳定O(n²)最好O(n)稳定O(n²)
内存使用
适用场景教学演示实际应用指针学习
优化程度无优化提前终止无优化

总结

三种冒泡排序实现各有特色:

  1. 方法一最适合算法初学者,代码清晰易懂

  2. 方法二在实际开发中最实用,具备智能优化能力

  3. 方法三适合想要深入理解指针和内存操作的开发者

虽然冒泡排序在实际应用中效率不高,但作为算法学习的入门课程,它帮助我们理解排序的基本概念和算法优化的重要性。掌握这三种实现方式,能够为学习更复杂的排序算法打下坚实基础。

无论选择哪种实现方式,理解算法背后的思想才是最重要的!

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

相关文章:

  • 网页设计平面设计温州网站优化页面
  • 特别分享:聊聊Git
  • M|蝙蝠侠:侠影之谜
  • crawl4ai智能爬虫(一):playwright爬虫框架详解
  • 探究Java、C语言、Python、PHP、C#与C++在多线程编程中的核心差异与应用场景
  • 国外网站模板网站建设ui培训班好
  • 瑞安建设公司网站旅游网站系统的设计与实现
  • MongoDB-基本介绍(一)基本概念、特点、适用场景、技术选型
  • 国产之光金仓数据库,真能平替MongoDB?实测来了!
  • 网站开发需要学什么语言wordpress所有栏目循环输出
  • 低代码革命:拖拽式界面生成器与API网关的深度集成
  • “事件风暴 → 上下文映射 → 模块化”在 ABP vNext 的全链路模板
  • 如何在Linux服务器上部署jenkins?
  • 2.1 阵列信号处理基础
  • Centos7下docker的jenkins下载并配置jdk与maven
  • 网络数据侦探:抓包工具在爬虫开发中的艺术与科学
  • 手搓docker - 实现篇
  • soho做网站谷歌推广网站建设采购项目
  • 深入理解HTTP协议的本质
  • 以太网通信
  • 网站运营推广方式网站建设需要学编程么
  • 开源合规:GPL-3.0项目的专利风险规避
  • Java基于SpringBoot的医院门诊管理系统,附源码+文档说明
  • windows查询与设备通讯的mac地址
  • Tauri Android 开发踩坑实录:从 Gradle 版本冲突到离线构建成功
  • nuxt3中使用defineAsyncComponent懒加载组件,但其中的loadingComponent和errorComponent为什么不生效
  • GIS中最常用的编程语言
  • 用wordpress做的网站有哪些公司网站建设成本
  • 网站网页怎么设计无代码开发软件
  • 阿里发布「夸克 AI 眼镜」:融合阿里购物、地图、支付生态;苹果拟收购计算机视觉初创 Prompt AI丨日报