冒泡排序与qsort函数详解

article/2025/9/18 3:57:16

  提及到排序,冒泡排序算是一个很基础的排序了。那么冒泡排序到底是什么呢?冒泡排序在什么情况下使用呢?qsort函数又是什么呢?接下来我给大家通过举例来详细解释一下。

引入

    这里给大家一个题目,大家可以简单思考一下: 

  例:

int arr[]={3,2,1,4,5,6,8,7,9,0,10};

    将上面数组中的整数排成有序数组(这里的有序是指升序或者降序)。 

   当然,一题可能会有多解。在这里我给大家提供两种思路,也就是我们本次要详细解释的冒泡排序与qsort函数。

 一、冒泡排序

1、冒泡排序的简单解释

  首先,冒泡排序是一个比较简单的排序算法。它就是将数组中相邻的两个元素进行比较交换,经历过多次遍历数组会到达让一个乱序的数组变成有序数组的一个效果。我们发现,这样的排序就像一块很重的石头沉向底部,或者较轻的小气泡浮向水面,所以我们把这样的排序称之为冒泡排序。冒泡排序的英文名为 Bubble sort,我们也是经常可见的。

2、冒泡排序的详解思路

  我们这里就用引入中例题来做一个详细的解释。我们先例题的数组排成升序来看。我们先看一下第一冒泡排序。如图:

 

  通过上面发现,第一趟排序我们把相邻将较大的数字往后移了一位,也就是每趟排序都会把最大的数字放到最后一位。下一趟排序我们就可以不再和已经排好数字比较。我们这里仔细想一下,如果多次重复这样的操作,会不会将数组排成我们所要的升序呢?答案是肯定会的。那么我们需要几趟这样的排序呢?我们接下来看一个同样是十一个整数,需要这样排序趟数数最多的一个例子。如图:

 

   我们通过上图可以相出,对有n个数字的整形数组排序,我们最坏的情况是需要排n-1趟;这样就是整个冒泡排序的思路了。接下来我们可以结合着代码一起理解一下。

#include<stdio.h>
int main()
{int arr[] = { 3,2,1,4,5,6,8,7,9,0,10};int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);//对arr进行排序,拍成升序//确定冒泡排序的趟数 for (i = 0; i < n - 1; i++){int j = 0;int flag = 1; //假设这一趟排序已经是完全有序 //每一趟冒泡排序 for (j = 0; j < n - 1 - i; j++) //每次需要比较的整数的个数{if (arr[j] > arr[j + 1]){int num = arr[j];arr[j] = arr[j + 1];arr[j + 1] = num;flag = 0;//这趟排顺序不完全有序 }}if (flag == 1){break;}for (i = 0; i < sz; i++){printf("arr[%d]=%d\n", i, arr[i]);}return 0;
}

   这里我再解释一下,为什么要设置一个变量flag。在大多情况下,我们都是不用到排n-1趟就已经是有序的了。所以我们这里来设置一个变量flag来判断是否已经有序,来提高代码的效率。当有一趟排序不再交换数字时,就说明这组数字已经是有序的数组了。也就是不用再循环比较了。当这一趟排序仍有交换数字时,说明还不是有序数组,还需要循环进行下一趟比较。 

   到这里你应该对冒泡排序已经有了一个很好的了解。但是我们发现,冒泡排序好像只是能排整形,那么其他类型的怎么排序呢?c语言这时给我们提供了qsort函数,我们再来了解一下qsort函数。

 二、qsort()函数

1、qsort函数简单解释

  1. qsort函数时c语言的库函数,所在的头文件是<stdlib.h>
  2. qsort函数是一个排序函数,可以简单理解为冒泡排序的升级版,可以排序任意类型。

2、qsort函数用法及详解

  qsort()函数的底层实现是用快排实现的,在这里我们只需要掌握其用法即可。

  我们先来看一下标准的qsort函数的用法:void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) ); 

  从上面我们可以看出,qsort的返回值类型是void型,有四个参数。我们再看一下四个参数分别的含义:

  1. 第一个参数意义:数组的首元素地址;
  2. 第二个参数意义:数组中元素的个数;
  3. 第三个参数意义:数组中每个元素的大小(单位是字节);
  4. 第四个参数意义:比较函数(这里的比较函数是要自己写的,有固定格式);

  我们通过qsort函数来对上面的例题进行排序,代码如下:

#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void*e1,const void*e2)
{return *(int*)e1-*(int*)e2;
}
int main()
{int arr[] = { 3,2,1,4,5,6,8,7,9,0,10 };int sz = sizeof(arr) / sizeof(arr[0]); //计算数组元素的个数qsort(arr,sz,sizeof(arr[0]),cmp_int);for (i = 0; i < sz; i++){printf("arr[%d]=%d\n", i, arr[i]);}return 0;}

 通过上面的代码我们先来熟悉一下我们自定义的比较函数。这里的比较函数两个参数是固定的,返回类型为int型。我们只要要做的是把两个参数转换为你所需要比较类型的指针,然后再解引用即可。这里我给大家多举几个例子,方便理解。如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp_int(const void*e1,const void*e2)
{return *(int*)e1-*(int*)e2;
}
void test1()
{int arr[]={9,8,7,6,5,4,3,2,1,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 cmp_float(const void* e1,const void* e2)
{return (int)(*(float*)e1-*(float*)e2);
}
void test2()
{float ar[]={9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0,1.0,0.0};int sz=sizeof(ar)/sizeof(ar[0]);qsort(ar,sz,sizeof(ar[0]),cmp_float);int i=0;for(i=0;i<sz;i++){printf("%f ",ar[i]);}
}
struct stu
{char name[20];int age;
};
int cmp_by_age(const void*e1,const void*e2)
{return ((struct stu*)e1)->age-((struct stu*)e2)->age;
}
void test3()
{struct stu s[3]={{"zhangsan",20},{"lisi",25},{"wangwu",30}};int sz=sizeof(s)/sizeof(s[0]);qsort(s,sz,sizeof(s[0]),cmp_by_age);int i;for(i=0;i<sz;i++){printf("%d ",s[i].age);}
}
int cmp_by_name(const void*e1,const void*e2)
{return strcmp(((struct stu*)e1)->name,((struct stu*)e2)->name);//这里引用了strcmp()函数,头文件为string.h,这个函数的作用是将字符串进行比较大小,比较的是字符串首个字母,首个字母转换为ASCLL码值进行比较。 
}
void test4()
{struct stu s[3]={{"zhangsan",20},{"lisi",25},{"wangwu",30}};int sz=sizeof(s)/sizeof(s[0]);qsort(s,sz,sizeof(s[0]),cmp_by_name);int i;for(i=0;i<sz;i++){printf("%s ",s[i].name);}
}
int main()
{//test1();//test2();//test3();test4();return 0;
}

 通过测试,我们发现qsort函数默认的排序是升序的。当然我们想要降序的时候,只需要将比较函数中的e1-e2改成e2-e1即可;

  我们了解完qsot函数后发现:相对冒泡排序,qsort函数的应用范围更广,也更加方便。

 总结

  1. 冒泡排序可以将乱序的数组排成有序的数组。
  2. 重点掌握的是冒泡排序的思路。
  3. qsort函数应用范围相对冒泡排序比较大。
  4. qsort函数应用起来较为方便。
  5. 重点掌握qsort函数的用法。  

   感谢您的观看,希望以上内容对你有所帮助。


http://chatgpt.dhexx.cn/article/oFpXhHSd.shtml

相关文章

模仿qsort功能实现一个冒泡排序

目录 1.简单介绍qsort 2.模仿qsort实现冒泡排序 qsort函数原型 void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*)); 一些解释: 1.base:指向要排序数组的第一个对象 类型为void* 2.num:base所指向数组的元素总数…

字符串的冒泡排序

字符串的冒泡排序 本题要求使用冒泡排序法对任意给定的N个字符串按从小到大排序&#xff0c;输出扫描完第K&#xff08;K<N&#xff09;遍后的中间结果序列。 输入格式&#xff1a; 输入在第1行中给出N和K&#xff08;1≤K<N≤100&#xff09;&#xff0c;此后N行&…

冒泡排序(C语言)

文章目录 1. 冒泡排序如何实现1.1 冒泡排序函数的错误设计1.2 数组名是什么&#xff1f;1.3 冒泡排序函数的正确设计 1. 冒泡排序如何实现 往往我们在写代码的时候&#xff0c;会将数组作为参数传个函数&#xff0c;比如&#xff1a;我要实现一个冒泡排序&#xff08;这里要讲算…

模仿qsort实现一个冒泡排序的通用算法

&#x1f4a5;qsort函数介绍&#x1f4a5;冒泡排序介绍&#x1f4a5;什么是冒泡排序的通用算法&#x1f4a5;模仿qsort的一个冒泡排序的通用算法&#x1f4a5;结语 &#x1f525;qsort函数介绍 在一些编程题中经常需要你按照某个指标按照从小到大或从大到小输出一些数据&#x…

c语言冒泡排序数组指针,c语言冒泡排序,指针,数组

冒泡排序算法的运作如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面…

汇编——实现冒泡排序+讲解

题目描述&代码 有一个首地址为A的N字数组&#xff0c;编写程序采用冒泡排序使该数组中的数按照从大到小的次序整序。 数据存储在A的数组中&#xff08;即内存中&#xff09;&#xff0c;我们需要利用冒泡排序实现从大到小排序。 ;description data SEGMENT USE16a dw …

实现一个通用的冒泡排序 - C语言

一、前言 在对一组数组进行排序是&#xff0c;我们经常用到冒泡排序&#xff0c;它是一种较简单的排序算法。 冒泡排序的原理如下&#xff1a; 比较相邻的两个元素。如果第一个比第二个大&#xff0c;就交换它们两个。对每一对相邻元素做同样的工作&#xff0c;从开始第一对到…

第三次项目需求文档

北京理工大学大学疫苗接种系统 文章目录 一.UML图1.用例图2.类图3.活动图4.顺序图 二.需求规格说明文档1.需求和功能说明1.1.获取的功能需求.2.功能划分1.2.1.登录界面1.2.2.预约服务1.2.3.接种查询 2.工作量展示2.1.需求获取2.1.1.项目前景和范围2.1.2.涉众分析2.1.4.面谈 2.…

项目文档编写规范

此文件是 项目文档编写规范 的 readme 编写范例&#xff0c;点击 我要改进 即可查看其 Markdown 内容。 项目概述 产品名称&#xff1a;LaraBBS 项目代号&#xff1a;larabbs 官方地址&#xff1a; https://learnku.com/laravel/t/6592 LaraBBS 是一个简洁的论坛应用…

项目文档管理

项目文档管理&#xff08;Project Documents Management&#xff09; 目录 [隐藏 ] 1 项目文档管理的概述 2 文档管理在项目进程中的重要作用 3 如何建立项目文档管理规定 4 参考文献 <script type"text/javascript"> if (window.showTocToggle) { var …

项目文档如何管理?

在项目进行过程中&#xff0c;会产生很多相关文档文件。通常会散落的分布在不同员工的设备中以及聊天记录中&#xff0c;这种管理方式不仅增大了文件丢失的风险&#xff0c;而且不利于团队文件协作&#xff0c;以及项目经验知识沉淀。 项目文件的管理是项目管理中不可缺少的一…

项目部署文档

1.前提环境 名称版本jdkjdk1.7(建议不要超过1.8)mysql5.7tomcat7(建议不要超过8) 输入 java -version出现如下为jdk安装成功 2.Java环境安装与配置 参见&#xff1a;https://www.linuxidc.com/Linux/2017-01/139212.htm 3.Tomcat安装部署说明 以使用提供的tomcat为例tar z…

如何写项目文档?项目文档有哪些?

软件新人经常问我一个项目应该到底有哪些文档&#xff0c;在此结合工作实际把我一般形成的文档作一列表&#xff0c;仅供诸位参考。 一、项目立项建议书 项目立项建议书主要用于分析项目要求与各种资源是否能够匹配&#xff0c;用来决策层决定是否最终立项。 主要要素包括&…

synplify成功运行起designware的方法,巨坑

因为手头FPGA是zynq ultrascale。所以更新了synplify到2019版本。手里的项目必须要用designware来做验证。各种研究&#xff0c;填了N多的坑。终于搞定。 先说原理&#xff1a; 1. 电脑上有design compile&#xff0c;license各种都搞定&#xff0c;dw库可用。可以装在虚拟机…

VIVADO2018与SYNPLIFY联合使用

VIVADO2018与SYNPLIFY联合使用 1、synplify生成网表文件.edf ①新建工程&#xff0c;设置所选的FPGA型号。 ②添加源文件&#xff0c;可以源文件&#xff0c;也可以是包括很多源文件的文件列表&#xff08;.v/.sv&#xff09;。 ③根据需要添加约束文件.fdc。 ④点击RUN生成网…

ModelSim,synplify,ISE后仿真流程

首先&#xff0c;我把我用到的软件说明一下。如果你发现根据我的操作&#xff0c;你还是解决不了ModelSim后仿真的问题&#xff0c;那就可能是软件版本的问题。 1&#xff0c; ModelSim Se 6.1b 2&#xff0c; Synplify Pro 7.5.1 3&#xff0c; ISE 5.2i &#xff08;这个…

Python 中的Sympy详细介绍

Python 中的Sympy详细使用 遇到复杂计算找python绝对不让你失望&#xff0c;sympy是一个Python的科学计算库&#xff0c;用一套强大的符号计算体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等等计算问题。虽然Matlab的类似科学计算能力也很强…

如何使用synplify综合ISE Core Generate生成的IP核

Xilinx的ISE软件有自带的综合工具XST&#xff0c;但是我们有时候需要使用第三方的综合工具&#xff08;例如Synopsys的Synplify Pro,Synplify Primier&#xff0c;其中&#xff0c;Synplify Primier可以综合synopsys的DesignWare库&#xff09;&#xff0c;这时候就需要在synpl…

synplify 9.6.2 download

现在这种工具太难找了&#xff0c;找了一上午才搞定&#xff1b;唉&#xff0c;还是贡献出来吧&#xff0c;最好别被河蟹掉 链接&#xff1a;http://pan.baidu.com/s/1pJv7ovx 密码&#xff1a;um2k 里面的破解方法有点问题&#xff0c; 一、install exe&#xff0c;选Fl…

如何破解Synplify Pro 9.6.2? (SOC) (Synplify)

软件安装与注意事项如下&#xff1a; Introduction Step 1&#xff1a; 安裝Synplify Pro Step 2&#xff1a; 選擇Floating (License is on a license server) Step 3&#xff1a; 稍後會設定SYNPLCTYD_LICENSE_FILE&#xff08;我认为是LM_LICENSE_FILE&#xff09;系統變數&…