冒泡排序进阶

冒泡排序的进阶用法 相比于一般的冒泡排序,这种进阶版的冒泡排序更加的完善。这种进阶的冒泡排序可以将任何的类型进行排序,比一般的冒泡排序更加的完备。 这里运用到了一个qsort函数的一种思想,我们qsort函数中有四个参数,我们就运用到了第4个参数–>函数指针 首先了解qsort函数的参数部分 void sqort(void base, size_t num, size_width, int(cmp)(const void e1, const void e2); 第一个参数 – 待排序数组的起始位置 第二个参数 — 待排序 阅读详情

序

本次在学习c语言的时候,学到冒泡排序,但是这只能对整型的数据类型排序,没有办法对字符型或者结构型数据类型进行排序,因此这里扩展一个通用的冒泡排序法

 这里先看原来冒泡排序的方法,不做过多介绍,可以先复习一下

void bubble_sort(int arr[], int sz)
{
	int i = 0;
	//趟数
	for (i = 0; i < sz-1; i++)
	{
		int flag = 1;//假设数组是排好序的
		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;
				flag = 0;
			}
		}
		if (flag == 1)//如果已经是排好序的,那么flag等于1,无须再进行后面的排序
		{
			break;
		}
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0};
	//数组排成升序
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
	return 0;
}

接着我们要学习一个新的函数-------qsort函数


qsort函数

msdn解释如下:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

qsort使用的是快速排序思想实现的排序函数,是c语言本身提供的函数,参数__cdecl *compare是函数调用约定,这里不做多介绍,const void* e1,const void*e2是函数指针,void* base是排序的起始位置,num是待排序的数据元素的个数,width是待排序的数据元素的大小,单位为字节。

这个函数可以排序任意类型的数据类型,我们回来看最初冒泡排序的算法,我们知道现在这个冒泡排序不完美在于他只能排序整型类型,因此我们需要改变的是参数的类型,还有两个元素间的比较,但是这里也有一个问题------不同的数据类型排序方法不同

所以qsort函数将不同类型数比较方法提取出来,就是参数中int (*cmp)(const void *elem1, const void *elem2 ) )这个函数指针,这个比较方法由我们定义,相当于回调函数

qsort返回值:

  • Return ValueDescription
    < 0elem1 less than elem2
    0elem1 equivalent to elem2
    > 0elem1 greater than elem2

 


qsort函数排序整型

因此我们可以写出代码(这里以整型类型比较为例):

cmp_int(const void* e1, const void* e2)
{
	if (*e1 > *e2)
		return 0;
	else if (*e1 == *e2)
		return 0;
	else
		return -1;
}

这里返回0,1,-1好让qsort知道我们比较整型的大小结果

好像明白了,但是还是有个问题,就是我们设立函数去比较时候,肯定调用void*的函数(void*是无具体类型的指针,可以接收任意类型的地址,所以不能解引用,也不能+-整数)但是我们没办法将void*指针解引用呀,所以我们要将void*强制类型转换

修改如下:

cmp_int(const void* e1, const void* e2)
{
	if (*(int*)e1 > *(int*)e2)
		return 0;
	else if (*(int*)e1 == *(int*)e2)
		return 0;
	else
		return -1;
}

但是这样语句比较啰嗦,我们可以用相减的方法去判断结果正负:

//比较两个整型元素
//e1指向一个整数
//e2指向另一个整型
int cmp_int(const void* e1, const void* e2)
{
	return (*(int*)e1 - *(int*)e2);
}

int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0};
	//数组排成升序
	int sz = sizeof(arr) / sizeof(arr[0]);
	/*bubble_sort(arr, sz);*/
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
	return 0;
}

如果要想改变为降序,只需要改为return (*(int*)e2 - *(int*)e1);就可以了


qsort排序结构体类型

直接上代码,详细解释注释已标:

struct Stu
{
	char name[20];
	int age;
};

int cmp_stu_by_name(const void* e1,const void* e2)
{
	//strcmp返回的值恰好为>0,<0,=0
	//这里比较名字,为字符串,因此需要strcmp函数来比较,strcut Stu*为强制类型转换
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}

//测试使用qsort来排序结构数据
void test1()
{
	struct Stu s[] = { {"zhangsan",15},{"lisi",30},{"wangwu",25} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}

注意:strcmp比较是一个字符一个字符的比较,比如a>b,b>c

【Audio driver】深入解析mixer_paths.xml中的音频通路配置 本文深入解析了Android音频驱动开发中的核心配置文件mixer_paths.xml。文章以高通平台为例,详细阐述了音频通路(FE、BE、DSP、Device)的概念与连接逻辑,并通过实战案例拆解了扬声器与麦克风通路的配置方法、关键控件作用及调试技巧,是理解与定制Android音频系统的实用指南。 阅读详情

相关推荐

STM32的GPS数据提取程序设计说明——基于NMEA0183协议

一、硬软件平台 本次程序实现效果为对GPS信号穿送来的数据进行筛选,并将筛选后的信息通过上位机显示出来,所以此次设计所需硬件包括STM32F407、RS232转TTL、CH340USB转串口模块,注意该模块在使用前,对应的系统需要安装驱动,否则串口调试助手无法识别,另外还包括JLink下载器。 本次代码设计软件为KEIL5并结合F4固件包,上位机系统为WIN7,主机系统为WIN10。 二、算法总体思路设计 由于GPS通过RS232将数据传送给板子,因此使用两个串口资源(串口1和串口2),其中一个用来

小景的博客 6181

冒泡排序的三种进阶方法

import java.util.Arrays; /** * @Description 冒泡排序的三种进阶方法 * 从小到大排序 */ public class PopSort { public static void main(String[] args) { int[] a = {1,232,32,412,32,42,34,2,32,423,1,3,42,3,12,4,4,213,25,421,4}; PopSort popSort = new Po.

qq_40419501的博客 484

【数据攻略】字节面试真题(含答案)+100道面试题库

数据攻略

qq_40002713的博客 4102

C语言进阶之冒泡排序

中的e1,e2就是我们要比较数据的地址。在这个比较函数中我们实现不同类型的元素比较void*是无具体类型的指针,可以接收任何类型的地址void*是无具体类型的指针,所以不能解引用操作,也不能+-整数当比较函数返回的是大于0的数字,那么两组数据就会进行交换。进行整型数据的比较, 这是进行升序排列。

2302_79491024的博客 819

水下井口装置及钻杆建模

内容:海上油气资源开采的过程中,通常会由海上钻井平台下入钻杆连接到海底井口装置。OrcaFlex软件可进行各种海洋工程结构动态分析,通过各项数据的输入,能够很方便地进行水下井口装置及钻杆建模。直接使用软件New Line及new vessel功能,再设置模型的各项参数(几何属性、弯曲刚度、轴线刚度、扭转刚度、泊松比等)即可建成井口装置及钻杆模型。 设置管线的几何属性:主要包括管线的内外径、壁厚、...

s0302017的博客 1144

西门子828D/840DSL数控机床产量数据采集实战:一个C#程序员的踩坑与填坑记录

本文详细记录了C#程序员在西门子828D/840DSL数控机床产量数据采集实战中的经验与教训。从硬件连接到软件配置,再到数据读取与异常处理,文章分享了工业现场编程的特殊挑战和解决方案,特别是针对数控系统的TCP/IP通信、PLC变量地址映射及数据解析等关键技术点。

weixin_42741930的博客 596

C语言进阶:冒泡排序

冒泡排序的算法:对数组的排序。

clanguagnew的博客 147

RISC-V CPU设计(三)---多周期CPU的设计与实现

基本情况 本多周期CPU支持RV32I指令集(fence,ecall,ebreak除外),已通过部分指令的测试,如代码有bug,欢迎指出。 模块划分 代码将CPU划分为以下几个模块: 1.控制单元:ControlUnit 用于产生控制信号,是CPU的大脑,指挥中枢。 2.分支决策单元:BranchUnit 用于决定B型指令是否发生跳转 3.立即数单元:ImmUnit 用于从指令中解析出立即数. 4.寄存器堆:RegisterFile RISC-V的32个寄存器,其中x0寄存器恒为0,不可更改。 5.指令存储

qq_40268672的博客 5542

冒泡排序(进阶)

上次我们讲了冒泡排序(初阶)这次我们试试进阶通过来进行多类型的排列(不知道的可以看我前面发的文章)。

zt3445164952的博客 397

李宏毅2025《机器学习》第一讲-生成式AI:技术突破和未来发展

本文基于台湾大学李宏毅教授的“一堂课搞懂生成式人工智慧的技术突破与未来发展”课程内容,系统性地梳理了生成式AI的核心概念、技术原理、发展演进以及未来趋势。文章从AI的“行为”入手,通过生动的实例展示了其强大的生成与推理能力;进而深入剖析其底层运作机制,阐释了“万物皆为令牌(Token)”、自回归生成、Transformer架构等核心原理;接着,文章追溯了通用AI模型从“专才”到“通才”的演进历程;最后,探讨了如何通过微调(Fine-tuning)、模型编辑(Model Editing)等技术赋予AI新的能力

木鱼时刻的专栏 2295

Keras中神经网络可视化模块keras.utils.visualize_util安装配置方法

Keras中神经网络可视化模块keras.utils.visualize_util安装配置方法

jacke121的专栏 2759

java进阶之冒泡排序

冒泡排序 思想:相邻元素两两比较,大的往后放,第一次完毕后,第一次完毕后,最大值就出现在了最大索引处,同理继续,即可得到一个排好序的数组。 举例 1.原始数组 2.第一次排序后 3.第二次排序后 4.第三次排序后 5.第四次排序后 规律 1.两两比较,大的往后放 2.每一次比较完成后,下一次比较总会减少一个元素的比较 3.第一次比较,有零个元素不比,    第二次比较,有一个元素不比    第三次比较,有两个元素不比    … 4.总

qq_45798550的博客 454

OpenClaw Skill 开发全攻略|2026 最新机制 + 文件处理实操,看完直接落地开发

很多新手刚接触时,会把 Skill 想得很复杂,其实大可不必。OpenClaw 中的每个 Skill,本质就是一套“能力描述 + 执行逻辑”的组合包,简单说就是“告诉 AI 你能做什么、怎么做,它就会调用你”,核心特征可以总结为这几点,好记又实用:核心载体:以文件夹为单位,不管多简单的 Skill,文件夹里都必须有 SKILL.md 文件——这是 AI 识别技能的唯一依据,少了它,再完善的代码也没用;

haolove527的专栏 7025

进阶冒泡排序

2.函数使用特别注意事项3.举例。

2301_81167291的博客 664

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

冒泡排序进阶版

冒泡排序的更快速版本 //从第一个数循环起 for (int i = 0; i < arr.length - 1; i++) { //判断数是否按照顺序排列 boolean judge = true; //从第个数循环起,到倒数第二个数 for (int j = 0; j < arr.length - 1 - i; j++) { //从小到大排列,若不是,则交换顺序 if(arr[j] > arr[j + 1]){ judge = false; temp = a

weixin_44371671的博客 240

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

进阶C语言:冒泡排序

初阶C语言--冒泡排序、qsort函数的使用、使用冒泡排序的思想实现类似于qsort的函数

Yikefore的博客 2995

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

冒泡排序以及冒泡排序的进阶优化

对冒泡原理,代码实现,代码优化等讲解

2301_80772499的博客 464

冒泡排序进阶优化

冒泡排序的思想:我们以升序排列为例,所谓冒泡排序就是在无序数组中每执行一趟选出这一趟中最大的数放在最后面,第二趟选出次大的数放在倒数第二位上,直到完成排序。以此类推降序就是将小的数放在后面排序。代码如下: 方法(一) 1 var arr = [6, 5, 3, 4, 1, 2]; 2 function sort(arr) { 3 var maxN...

weixin_30597269的博客 162

数据结构与算法系列——冒泡排序进阶

        博主我在上一篇博客中已经详细地讲解了关于冒泡排序算法的相关知识了,不过接下来的这篇博客将会进一步地阐述冒泡排序中需要注意的知识点,这一点我觉得相当重要,所以在此又开了进阶篇,那么接下来我们将会从  对比次数,交换次数,元素地址还有已经排好序的几个方面详细讲解。        首先我们先把算法给展示出来:如下/** * 比较次数 交换次数 变量 (注意,已经排好序的情况) * ...

何冠勋的博客 570

【C语言】进阶版冒泡排序(qsort函数思想)

本文包含冒牌排序、qsort函数的讲解与实例、以及用代码实现qsort功能的进阶版冒泡排序法。

weixin_52587478的博客 846

新手进阶之路之JAVA冒泡排序实现

JAVA冒泡排序 package hello; public class hellojava { public void ShowArray(int array[]) { for(int x:array) { System.out.print("》"+x); } } public void BubbleSort(int array[]) //冒泡排序 { for...

weixin_41914727的博客 235

java版冒泡排序------>基础进阶版1

java版冒泡排序------>基础进阶版1

雪华杉的博客 172
上一篇: 扫雷游戏实现和学习思路
下一篇: 数组的随机排序(java版)
KAI_KD
博客等级 码龄4年 125粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值