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

【冒泡排序】详解以及优化

目录

一、冒泡排序的核心思想

二、代码演示

1.常规思路

2.优化版本(减少了非必要排序)

3.利用冒泡原理模拟qsort函数


一、冒泡排序的核心思想

两两相邻的元素进行比较。

形象化理解:每一趟冒泡排序就像水底冒泡泡一样,将要排序的数字逐对逐对比较,从底部移动到顶端,可结合下图进行体会。

注:

若有n个数字,则进行n-1趟冒泡排序

每一趟排序若未排的数字为n,则需进行n-1对数字比较

冒泡排序局限;一般只用来排序整型数据

两个整型元素可以直接使用>或<比较

但是两个字符串、两个结构体元素是不能使用>或<比较的。

字符串可以使用strcmp函数比较


二、代码演示

1.常规思路

void bubble_sort(int arr[], int sz)//参数接收数组元素个数 { for(int i = 0; i < sz-1; i++) { for(int j = 0; j<sz-i-1; j++) { if(arr[j] > arr[j+1]) { int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } } int main() { int arr[] = {3,1,7,5,8,9,0,2,4,6}; int sz = sizeof(arr)/sizeof(arr[0]); bubble_sort(arr, sz); for(i=0; i<sz; i++) { printf("%d ", arr[i]); } return 0; }

2.优化版本(减少了非必要排序)

void bubble_sort(int arr[], int sz)//参数接收数组元素个数 { for(int i = 0; i<sz-1; i++) { int flag = 1;//假设这⼀趟已经有序了 for(int j = 0; j < sz-i-1; j++) { if(arr[j] > arr[j+1]) { flag = 0;//发⽣交换就说明,⽆序 int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } if(flag == 1) break; //这⼀趟没交换就说明已经有序,后续⽆序排序 } } int main() { int arr[] = {3,1,7,5,8,9,0,2,4,6}; int sz = sizeof(arr)/sizeof(arr[0]); bubble_sort(arr, sz); for(i=0; i<sz; i++) { printf("%d ", arr[i]); } return 0; }

3.利用冒泡原理模拟qsort函数

此时不再有数据类型的限制

#include<stdio.h> int my_cmp(const void* p1, const void* p2)//冒泡交换的判断条件 { return (*(int*)p1 - *(int*)p2);//*p1>*p2则返回大于0的数字,以此类推 } void exch(void* p1, void* p2, int size)//交换过程,将数据分成一份份交换。 { int i = 0; for (i = 0; i < size; i++) { char tmp = *((char*)p1 + i); *((char*)p1 + i) = *((char*)p2 + i); *((char*)p2 + i) = tmp; } } void my_qsort(void* base, int num, int width, int (*cmp)(void*, void*))//模拟的qsort函数,利用函数指针间接利用判断函数 { int i = 0; for (i = 0; i < (num - 1); i++)//冒泡排序趟数 { int j = 0; for (j = 0; j < (num - 1 - i); j++)//一趟冒泡排序 { if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)//判断 { exch((char*)base + j * width, (char*)base + (j + 1) * width, width);//排序 } } } } int main() { int arr[] = { 0,7,6,4,3,5,9,8,2 }; int i = 0; my_qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), my_cmp); for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }

这种方式的灵活性在于引入了函数指针,只需要按需要排序的数据类型选择合适的比较判定函数,再将其传给函数指针,利用函数指针来调用即可。


感谢阅读,本文如有错漏之处,烦请各位斧正。

http://www.jsqmd.com/news/1348968/

相关文章:

  • 寄快递20公斤要多少钱?安能物流收费标准大揭秘,附省钱技巧 - 快递物流资讯
  • 解决webscreenshot常见问题:超时处理、证书错误与截图质量优化方案
  • leaflet-omnivore终极解析:一站式解决CSV、TopoJSON与WKT格式转换难题
  • 苏州工业园区打井降水井多少钱?厂房建设井点降水施工价格 - 瑞溪泉水利
  • CPU的架构:x86是什么?arm又是哪儿来的?
  • 深入Ouroboros源码:揭秘Rust自引用安全机制的实现原理
  • 温州市永嘉县GEO城市合伙人选型推荐哪家靠谱:本地团队怎么把源头技术、合伙人权益和区域保护一次看清 - 科技快讯
  • OpenAI Agents Python SDK:构建多智能体工作流的终极完整指南
  • 高级开发者必备:gh_mirrors/bi/binary_search四元查找算法深度剖析
  • GitHub资源下载效率神器:告别克隆整库的3步精准提取法
  • IntelliQ高级技巧:自定义意图与词槽模板的扩展方法
  • kubernetes-el核心功能解析:从Pod管理到日志查看全攻略
  • #福建性价比高的漆线雕礼品怎么选看鹭艺轩漆线雕 - 品牌优推
  • Postmanerator模板助手全解析:打造个性化API文档
  • SMOTE-variants模型选择攻略:交叉验证与参数调优的最佳实践
  • C# .NET 周刊 |2026 年 7 月 2 期
  • CF Clearance Scraper高级技巧:如何优化浏览器资源占用与请求效率
  • 2026年08月:中央空调智能集控与节能改造服务商实力解码 - 卓企推荐
  • 不用装 PS!3 个国产在线修图宝藏,免费无水印,小白点开就能修 - GrowthUME
  • 2024年网站搭建避坑指南:深度解析高性能标准网站建设进阶指南 pdf 实战技巧
  • AMD Phi-4-reasoning-plus-w8a8-llmcompressor-v0.12.0震撼发布:革命性8位量化技术如何让CPU推理效率提升46%?
  • Web Audio API实战:STFU如何通过音频反馈循环实现噪音抑制功能
  • 3分钟找回加密压缩包密码:免费开源工具终极指南
  • AppLocker与WDAC深度对比:AaronLocker如何一站式解决Windows安全控制难题
  • 马鞍山市花山区GEO城市合伙人选型推荐哪家靠谱:源头厂商、合伙人权益与区域保护怎么判断? - 子柔传媒
  • CC Switch:AI编程助手的终极配置管理神器
  • 东莞市景润化工有限公司-硼砂供应源头厂家实力解析 - 卓企推荐
  • 为什么选择lldpd?5大核心功能让网络设备发现更高效
  • 文献综述写到头秃?毕夏AI官网来救场!手把手教你搞定学术“拦路虎”
  • 硕博论文必备一键生成论文,掌桥科研AI论文写作VSKimi必看! - 掌桥科研-AI论文写作