C语言在实现冒泡排序时出现的问题


文章目录

  • C语言在实现冒泡排序时出现的问题
  • 前言
  • 一、冒泡排序是什么?
  • 二、使用步骤
    • 1.简单冒泡排序
    • 2.高级冒泡排序(针对于所有排序)
    • (1)main函数中参数的选择
    • (2)bubblesort函数的实现原理
    • (3)比较函数的实现
    • (4)交换函数的实现
    • (5)打印函数的实现
  • 总结

前言

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。


提示:以下是本篇文章正文内容,下面案例可供参考

一、冒泡排序是什么?

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

二、使用步骤

1.简单冒泡排序

代码如下(示例):

void bubblesort(int arr[], int sz)
{int i = 0;for (i = 0; i < sz-1;i++){int j = 0;for (j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);print_arr(arr, sz);
}

简单的冒泡排序具有一定的局限性,它无法对字符串或者结构体成员进行排序,所以接下来我为大家讲解高级冒泡排序!!!

2.高级冒泡排序(针对于所有排序)

首先我们要实现main函数,对于实现高级冒泡排序,我引用qsort库函数的知识!

这个就是qsort的函数参数(MSDN获取),在四个参数中,第一个参数用指针void*来接受,即它可以表示任意类型的数组!二三参数分别表示元素个数和元素一个的宽度!最后一个参数较为复杂,下文会有详解!
以qsort库函数参数为例,可以对BubbleSort函数参数全面改造一下


void bubblesort(void* base,int num,int width,int(*cmp)(const void*e1,const void*e2)

可能会有同学问为什么左后一个参数里面是void* e1void* e2
因为我们不知道比较两个元素的类型,const表示只比较,不修改!!!

(1)main函数中参数的选择

int main()
{int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubblesort(arr, sz, sizeof(arr[0]), cmp_int);print_arr(arr, sz);
}

这里的bubblesort传参就和qsort传参原理一致!

(2)bubblesort函数的实现原理

void bubblesort(void* base, int num, int width, int (*cmp)(const void* e1, const void* e2))
{int i = 0;for (i = 0; i < num - 1; i++){int j = 0;for (j = 0; j < num - 1 - i; j++){}}
}

bubblesort实现和简单冒泡排序实现原理一样,只是把原来的sz改成了num。
第二个for循环里面会有所不同

int j = 0;for (j = 0; j < num - 1 - i; j++){if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0){}}

bubblesort最后一个参数是函数指针,通过cmp就可以把cmp中第一个参数base+j*width和第二个参数base+(j+1)*width进行比较,此时j=0;访问的两个元素即为第一个元素和第二个元素,如果对文字有误解可以观看图文解释
总的来说,随着j的增长,会不断访问两个相邻的元素!

(3)比较函数的实现

既然我们知道了通过cmp可以找到相邻两个元素,那么我们就来实现比较函数!

int cmp_int(const void* e1, const void* e2)
{return (*(int*)e1 - *(int*)e2);
}

此时e1和e2两个形式参数传过来的就是9和8
把他们强制类型转换为int类型之后再进行比较(直接减法,return返回后和0进行比较)

(4)交换函数的实现

if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0){//交换函数Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);}

交换函数的参数和比较函数的参数一样,这里就不多介绍!重点是交换函数的实现过程!

void Swap(char* buf1, char* buf2, int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}

目前我的编译器是小端存储,如下图:

(5)打印函数的实现

这个模块相对来说简单一些

void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}

总结

以上就是今天要和大家分享的内容,两种冒泡排序的实现原理
日后还会为大家带来数据结构、c++STL的知识,希望大家可以多多关注
这篇文章是原著,如果有哪里不对的地方,多多指教!!!

【C语言深度解剖】冒泡排序你那些不知道的问题!相关推荐

  1. C语言深度解剖读书笔记

    开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有一段时间了,一直没有时间来写这篇博客.正巧还刚刚看完了国嵌唐老师的C语言视频,觉得两者是异曲同工,所以就把两者一起记录下 ...

  2. 《C语言深度解剖》中的.c/.h 程序模板及函数注释风格

    编程规范和变量命令规范对于代码的可阅读性.可维护性有着很大的影响.编程规范有很多,大公司也会制定自己公司的编程规范,如<华为技术有限公司c语言编程规范>等.对于个人编程来说没必要将自己编写 ...

  3. c语言深度解剖 pdf,c语言深度解剖(解密).pdf.pdf

    c语言深度解剖(解密).pdf.pdf 还剩 130页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: * Str ...

  4. C语言深度解剖读书笔记(1.关键字的秘密)

    开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有一段时间了,一直没有时间来写这篇博客.正巧还刚刚看完了国嵌唐老师的C语言视频,觉得两者是异曲同工,所以就把两者一起记录下 ...

  5. C语言深度解剖:关键字

    第一个C语言程序 内存 定义与声明 变量是什么 为什么要定义变量 定义变量的本质 定义声明 关键字 - auto 局部与全局变量 作用域 vs 生命周期 auto 关键字 - register 寄存器 ...

  6. C语言 | C语言深度解剖 ——章节2 符号

    C语言 | C语言深度解剖 --章节2 符号 C语言基本符号表 注释符号 // /* 几个似非而是的注释问题 y=x/*p 出色注释的基本要求 连接符和转义符 \ 单引号.双引号 花括号 运算符 10 ...

  7. C语言深度解剖 PDF 分享

    链接:https://pan.baidu.com/s/1U-8L7ZY5_sLpk4p0J302Mg           提取码:d8nu 相关推荐 [Objective-c程序设计] 中文编程·学习 ...

  8. 实验 c语言作用域实验,关于《C语言深度解剖》一些例程的实验和感悟——关键字static...

    最经买了一本好书--<C语言深度解剖>,书比较薄,看的比较快,而且也非常地吸引人,对于其中的一些讲解和例子都非常的经典,感觉有一些新的感悟.可能我的想法和水平非常菜,但是我只想是写点东西出 ...

  9. 《C语言深度解剖 》陈正冲

    网上的书评(说该书很好)几乎都是在扯淡. 该书死钻C语言中一些稀奇古怪的东西,不适合入门,书没有吹的那么好. 无聊的时候可以看看,略作消遣. 作者的口头禅是"很遗憾"," ...

最新文章

  1. 尤雨溪创立 Vue.js 的心路历程纪录片
  2. Resource temporarily unavailable 错误
  3. dataset中有多个表,返回XML字符串设置主从关系
  4. Python continue
  5. matlab2017b修改mesh的着色方案
  6. 工信部:手机预装软件下月起须报备审核
  7. 强势回归丨2021数据库大咖讲坛(第1期):数据库高可用容灾方案的实践与探索
  8. 视频列表页html,视频列表.html
  9. 腾讯 2017 年投资项目榜单 TOP 10,与阿里死磕到底?
  10. Swift - EasingAnimation绘制圆环动画
  11. linux静态网络带宽分配策略,Xen网络带宽分配优化方案的设计与实现
  12. MegaRAID Storage Manager RAID管理工具基本操作
  13. word文档左侧没有显示文档的目录
  14. 美国贷款买饭的房屋保险
  15. 傻X了:mac上编译的程序放到linux上运行
  16. Mac电脑升级13系统后,git clone 代码报错,mac升级后git ssh用不了
  17. oracle官文查看参数介绍的路径
  18. 慈溪视频软件测试,慈溪论坛
  19. Win10切换Administrator账户
  20. AI 人工智能 探索 (九)

热门文章

  1. CSS——CSS 背景应用
  2. ArcMap和ArcGIS Pro加载星图地球wmts数据服务
  3. numpy.where和numpy.piecewise的用法
  4. mysql余额高并发_高并发下作余额扣减的一些经验
  5. BOJ262 Channel Coding DP
  6. 通过sql去掉字段中的html标签
  7. hdu1024-Max Sum Plus Plus
  8. php curl 加载证书,php curl请求时,设置客户端证书及私钥
  9. Praat脚本-037 | 批量把标注TextGrid生成韵律文本
  10. 【连载】 FPGA Verilog HDL 系列实例--------8-3 BCD七段显示译码器