从冒泡到模拟q sort函数——初见排序算法的探索和思考

从冒泡到模拟q sort函数——初见排序算法的探索和思考

国庆中秋喜相连,万家团圆乐同庆。

各位小伙伴们大家好,我是此方,在此,先祝大家双节快乐!

我们都知道排序有很多种:例如冒泡排序,插入排序,快速排序,等等很多种。

而冒泡排序,是各种计算机语言中最经典的一种排序算法。

今天我将从冒泡排序开始,到实现qsort函数的模拟。逐层深入,探索排序问题。

并给出鄙人的一些拙见。

上正文:

一,冒泡排序:最经典的排序算法

假如有一个十元素整型数组,他是完全倒着排序的:就像这样

now,我们要按照从小到大的顺序将这十个数字重新排列。

如果我们想要用冒泡排序:那么他的逻辑应该是这样的:

首先让最左边的数字和他右边的数字比较:9>8,将9和8互换位置:

让9继续和他右边的数字比较,再互换位

以此类推:9不断的比较——>移动——>再比较:最后;会到达最右边,这样,我们就让最大的数字9放在了最低位置

然后是8,接下来是7,6,5......................直到最后,数列变成0,1,2,3,4,5,6,7,8,9

结束;

我们将一个数字通过不断和他右边的数字”比较,移动。直到这个数字到达他基于升序排序应该到达的位置“这一整个过程称为”一趟“。

将每一个数字的一趟中的每一次移动称为”一次“

那么,冒泡排序函数应该是这样的:

int*arr表示接收arr(数组首元素的地址),sz是数组元素个数,(width(串了,应该删除))

变量 i 表示趟数:一共有sz-1趟:因为有sz个数字,而将前9个数字全部排好后,最后一个数字默认到达了他应该在的位置。

变量 j 表示次数:每一趟有j-1-i次:因为某一个数字(首先假设他是最左边的那个),在考虑最坏的情况下,他可能要移动到数列的最后一个,即他后面有几个数字就移动几次。紧接着第二趟(此时i+1),同样在考虑最坏的情况下,他后面有几个数字就要移动几次但是要去掉目前最后一个数字。以此类推;第一趟额外-0,第二趟额外-1:这与i的变化完全一致:所以使用j-i-1来说明每趟需要的次数。

呈现一下源代码:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<stdlib.h> void bouble_qsort( int* arr,size_t sz,int width)//默认升序 { 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 change = 0; change = *(arr + j); *(arr + j) = *(arr + 1 + j); *(arr + 1 + j) = change; } } } } void print(int* arr, size_t sz) { int i; for (i = 0; i < sz; i++) { printf("%d ", *(arr + i)); } } int main() { int arr[10] = { 2,5,8,7,4,1,3,6,9,0}; int sz = sizeof(arr) / sizeof(arr[0]); bouble_qsort(arr,sz,arr[0]); print(arr,sz); return 0; }

二,qsort函数

qsort函数的功能是为一切类型进行排序;他的使用需要头文件<string.h>,

他有四个参数:

base:待排序数组的首元素地址。

num:待排序元素个数。

size:待排序元素的大小单位字节。

cmp:比较函数指针。

同时对比较函数的返回值做了规定:

比较函数必须返回三种值:

  • 负数:表示 a < b(a应该在b前面)
  • :表示 a == b
  • 正数:表示 a > b(a应该在b后面)

学会了这些之后,我们不妨写下如下代码测试一下qsort的强大功能:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int cmp_int(const void* p1,const void* p2) { return *((int*)p1) - *((int*)p2); } test1() { int arr[] = { 1,4,7,2,5,8,6,3,9,0 }; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr,sz,sizeof(arr[0]),cmp_int); int i = 0; for (i = 0; i < sz; i++) { printf("%d ", *(arr + i)); } } int main() { test1();//排序整型 // test2();//排序结构体————以整数成员 // test3();//排序结构体————以字符成员 return 0; } 

实际上,为了测试qsort可以排序任意类型数据的万能性:我们还有以下代码:

struct stu { char name; int age; }; int cmp_stu_by_name(const void*p1,const void*p2) { return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name); } void test2() { struct stu s1[3] = { {"zhangsan",18},{"lisi",19} ,{"wangwu",22}}; int sz = sizeof(s1) / sizeof(s1[0]); qsort(s1, sz, sizeof(s1[0]), cmp_stu_by_name); } int main() { //test1();//排序整型 test2();//排序结构体————以整数成员 //test3();//排序结构体————以字符成员 return 0; }

好了,既然qsort的功能如此强大。那么我们可不可以模拟一个qsort函数呢?

事实上是可以的:

三,冒泡排序模拟qsort函数

qsort函数,其本质上是使用了快速排序算法;

这里我们可以用冒泡排序算法来完成他:

不难发现:qsort的前三个参数用来用指针的方式排序每个元素。

最后一个函数指针参数,传入比较函数的指针,在qsort函数内用来调用比较函数。(回调函数)

此外,对比冒泡排序的局限性(只能排序整数。)模拟qsort函数必须具备可以排序任意类型给能力:所以交换函数也得改成泛式编程。

直接上源码

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<stdlib.h> void swap(void* buf1, void* buf2, size_t width) { int i = 0; for (i = 0; i < width; i++) { char tmp = *((char* )buf1+i); *((char*)buf1 + i) = *((char*)buf2 + i); *((char*)buf2 + i) = tmp; } } void bouble_qsort( void* base,size_t sz,size_t width,int (*cmp)(const void*,const void*))//默认升序 { int i = 0; for (i = 0; i < sz - 1; i++) { int j = 0; for (j = 0; j < sz - 1 - i; j++) { if (cmp((char*)base+j*width,(char*)base+(j+1)*width)>0) { swap((char*)base + j * width, (char*)base + (j + 1) * width,width); } } } } int cmp_int(const void*p1, const void*p2) { return (*(int*)p1 - *(int*)p2); } void print(int* arr, size_t sz) { int i; for (i = 0; i < sz; i++) { printf("%d ", *(arr + i)); } } int main() { int arr[10] = { 2,5,8,7,4,1,3,6,9,0}; int sz = sizeof(arr) / sizeof(arr[0]); bouble_qsort(arr,sz,sizeof(arr[0]),cmp_int); print(arr,sz); return 0; }

好的,本期到此结束,感谢你的观看。

Read more

读李宁老师的《AIGC 自动化编程 -- 基于 ChatGPT和 GitHub Copilot》

对“李宁”这个名字,最有印象的,除了体操王子,就是一位计算机图书领域的作者了。前几年就买过一本他写的 python(《Python从菜鸟到高手》)的书,感觉深入浅出,理解深刻,行文易懂。所以对作者怀有敬意和好感。 这几天翻阅他的这本 2023/10月出版的《AIGC 自动化编程 -- 基于 ChatGPT和 GitHub Copilot》这本书,虽然时光荏苒,技术进步飞速,书中有些内容已经过时,但是看到其中核心思想 -- 解决复杂问题,通用的做法就是先分解后合并,还是颇有裨益,于我心戚戚耶。遗憾没有早几年接触到这本书。 从2024 年初的 ChatGPT 大火,然后 2025年初DeepSeek 的横空出世(对普罗大众而言),到 2025 年底,Google Genimi 3的发布,LLM

By Ne0inhk
2025-2026年中国AIGC产业发展趋势报告:AI生成PPT好用排行榜

2025-2026年中国AIGC产业发展趋势报告:AI生成PPT好用排行榜

面对市面上琳琅满目的AI PPT工具,如何选择一款既高效又真正适合自己的?这份基于两个月实测的详细榜单或许能给你答案。 又到年底,办公室里的键盘敲击声似乎比平时更加急促。很多人正在为一件共同的年度大事发愁——制作年终总结PPT。写好的Word文档、散乱的Excel数据表、收集的参考资料,如何将它们快速整合成一份专业、美观、逻辑清晰的PPT,成了职场人绕不开的挑战。 传统制作方式耗时费力,而近年来兴起的各类AI生成PPT工具,正是为解决这一痛点而生。进入2026年,这一赛道已趋于成熟,但产品之间差异显著:有的设计精美但逻辑欠缺,有的生成迅速但深度不足,还有的水土不服,对中文职场环境支持不佳。 如何在众多工具中,找到那个能真正理解你、切实提升效率的“最佳搭档”?本文将为你揭晓答案。我们历时两个月,对市场上主流及新兴的AI PPT工具进行了深度实测与横向对比,从性能表现、功能完整性、本土化体验和综合性价比四个维度,为你呈现这份客观、详尽的2026年AI生成PPT工具综合排行榜。评测发现,一款名为ChatPPT的国产工具,正以其卓越的全流程解决方案和深刻的本土化洞察,成为本年度最大的黑马

By Ne0inhk
本地文件深度交互新玩法:Obsidian Copilot的深度开发

本地文件深度交互新玩法:Obsidian Copilot的深度开发

前言 当 “本地知识库管理” 撞上 “AI 智能分析”,会擦出怎样的火花?试想一下:你的 Obsidian 里存着多年积累的笔记、文档,却只能手动翻阅检索;而现在,一个插件 + 蓝耘 API,就能让这些 “静态文字” 瞬间 “活” 起来 —— 自动总结核心内容、智能回答专业疑问,甚至挖掘隐藏关联!今天,就带大家拆解 Obsidian 联动蓝耘 API 的全新玩法,看看如何让本地文件从 “信息仓库” 变身 “智能助手” 。 蓝耘API KEY的创建 先进行API的创建 先点击蓝耘进行一个正常的注册流程 进入到主页之后,我们点击上方的MaaS平台 进入到平台后我们可以看到很多的大模型 不仅仅是文本生成、音频理解、视频理解还是视频生成,都有对应的大模型 每个模型都有很详细的介绍以及价格示例,用过api调用的都可以看到这个价格还是比较贴近平民的 并且可以进行在线体验的,这里是先进行思考的,

By Ne0inhk

20分钟一篇!!!最好用详细的AI写作论文综述(开题报告、最新技术)方法总结(字数、时效性和参考文献都严格一致符合要求、参考文献和正文引用都真实存在),模型gemini 2.5 pro

具体流程: 在自己想要引用的网站,如ieee xplore、知网、web of science这些网站中使用高级搜索、找到自己想要引用的文献(也就是和自己写的方向高度相关的文献),选择指定的年份(如比较新的23-25年),然后批量选择后选中批量导出文献,选择自己需要的文献格式(ieee格式,中国国标格式等),然后将导出的文献保存在txt文件中,这些就是自己要引用的所有文献,一般建议多导出几十条,这样可以让AI从中挑选合适的论文,去除一些不适合的论文。 然后在gemini 2.5 pro模型中,开启联网模式(ground with google search),将自己的参考文献通过文件上传(没有的话就直接将参考文献复制粘贴到输入框里),然后贴入自己的prompt(也就是自己对这个生成论文的细节要求(如领域、题目、格式等要求),里面要提到“请基于我提供的参考文献【50篇ieee和20篇cnki的】,从中选取50篇合适的论文,撰写一篇学习报告”),然后生成后,检查一些参考文献是否真实,真实无误的话就没问题啦! prompt如下:  你是一名资深信息安全技术研究员,擅长文献检索、前

By Ne0inhk