模拟实现qsort函数的冒泡序列

使用 Tesseract 在 C# 中进行光学字符识别(OCR) 你可以根据需要对 Tesseract 进行自定义配置,例如设置识别的分辨率、识别模式等。// 只识别数字// 设置自定义变量本文只讲述了简单的使用方法,未涉及字库训练,识别的准确率与训练的字库有关。 阅读详情

qsort函数

qsort函数是一种可以对任意类型的数据进行排序的函数,它的定义在<stdlib.h>头文件中,它的函数原型如下:

void qsort(void *base, size_t num, size_t size, int (*compar)(const void*, const void *));

这个函数一共有四个参数,它们分别是:

  • 1.base:指向待排序数组的第一个元素的指针。

  • 2.num:数组中元素的个数。

    可以使用sizeof(arr)/sizeof(arr[0])来求出元素个数。

  • 3.size:每个元素的大小(以字节为单位)。

    可以使用sizeof(类型)求出,例如sizeof(int)。

    1. compar:指向比较函数的指针,该函数用于确定两个元素的顺序。

    qsort的使用

//排序整型数组
#include <stdio.h>
#include <stdlib.h>
int cmp(void* a, void* b)
{
	return (*(int*)a - *(int*)b);
}
//void qsort(void *base,
//	       size_t num,
//	       size_t size,
//	       int(*cmp)(const void*,const void*))
int main()
{
	int arr[] = { 9,7,6,5,8,4,2,3,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int size = sizeof(int);
	int i = 0;
	//打印原数组
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	qsort(arr, sz, size, cmp);
	//打印排序后的数组
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

qsort中的compar函数是需要自己编写的,它的作用是比较相邻两个元素的大小 ,它的返回值是int类型,有三种情况:

  • a>b -> 大于0
  • a<b - > 小于0
  • a=b -> 等于0
    输出结果为:(上方为原数组)

    (qsort默认是升序的,如果想降序可以将a,b调换一下)
//排序结构体数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stu
{
	char name[20];
	int age;
};
int cmp(const void* a, const void* b)
{
	return strcmp((*(struct Stu*)a).name, (*(struct Stu*)b).name);
	//这里排序Stu中的name字符串
}
int main()
{
	struct Stu arr[] = {{"zhangsan",20},{"lisi",30},{"wangwu",40} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int size = sizeof(arr[0]);
	int i = 0;
	qsort(arr, sz, size, cmp);
	for (i = 0; i < sz; i++)
	{
		printf("%s ", arr[i].name);
	}
	return 0;
}

字符串的比较是通过两个字符串中每位字符的ANSIC码值来比较的,例如”zhangsa“和“lisi”,"z"的码值比"l"大,所以“zhangsa”大。
结构体中调用其中的类型的方法有两种,一是**(结构体).(类型名)**,如(struct Stu a).name,另一种是(结构体指针)->(类型名),如((struct Stu*)a)->name。

冒泡排序对qsort的模拟实现

冒泡排序之前我们已经说过,它是一种将数据升序排列的方法,它的代码如下:

#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
	int i = 0;
	int flag = 1;//假如初始时便是正序
	for (i = 0; i < sz - 1; i++)//趟数
	{
		int j = 0;
		for (j = 0; j<sz-i-1;j++ )
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;//需要交换,就不是正序
				int tmp = 0;
				tmp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = tmp;
			}
			if (flag == 1)
			{
				break;//flag为1,即剩下的本就是正序,不需要再交换
			}
		}
	}
}
int main()
{
	int arr[] = { 3,1,7,4,2,6,8,9,0,5 };
	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函数一样可以排序任意类型的数据呢?
我们来分析一下:

void bubble_sort(int arr[], int sz)

对于int arr[],它的int类型应该变成void类型以便于接受任意类型的数据,仿照qsort的函数原型,我们将其变为:

void bubble_sort(void*base, size_t sz,size_t size,int(*cmp)(const void*e1,const void*e2))

那么如何向cmp函数传输某一个元素和下一个元素呢?我们可以这样:
我们之前传输了第一个元素的指针base和类型宽度size
在这里插入图片描述
我们可以将一个元素以字节为单位进行分割(以int为例)

在这里插入图片描述
如果将base强制转换为char *类型,根据char*的特点,char*+1移动一个字节,既然我们已经知道了类型长度size,那么(char*)base + 1*size便指向第二个元素arr[1],
(char*)base + j*size和(char*)base +(j+1)*size便指向arr[j]和arr[j+1]。
在这里插入图片描述
这样我们实现了任意类型的传输
总代码如下:

#include <stdio.h>
#include <string.h>
struct Stu
{
	char name[20];
	int age;
};
int cmp_int(void*base,size_t sz,size_t size,int j)
{
	return (*((char*)base + j * size)) - (*((char*)base + (j + 1) * size));
}
int cmp_struct(void* base, size_t sz, size_t size, int j)
{
	return  strcmp(((struct Stu*)((char*)base + j * size))->name, ((struct Stu*)((char*)base+ (j + 1) * size))->name);
}
void exchange(int(*cmp)(void* base, size_t sz, size_t size, int j),void* base, size_t sz, size_t size, int j)//交换
{
	if (cmp(base, sz, size, j) > 0&&size == sizeof(int))
	{
		int tmp = 0;
		tmp = (*((char*)base + (j + 1) * size));
		(*((char*)base + (j + 1) * size)) = (*((char*)base + j * size)) ;
		(*((char*)base + j * size)) = tmp;
    }
	else if(cmp(base, sz, size, j) > 0 && size == sizeof(struct Stu))
	{
		struct Stu tmp = *((struct Stu*)((char*)base + (j + 1) * size));
		*((struct Stu*)((char*)base + (j + 1) * size)) = *((struct Stu*)((char*)base + j * size));
		*((struct Stu*)((char*)base + j * size)) = tmp;
	}
}
void bubble_sort(void* base, size_t sz, size_t size)
{
	int i = 0;
	int flag = 1;//假如初始时便是正序
	for (i = 0; i < sz - 1; i++)//趟数
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
		//判断要交换数据的类型
			if (size == sizeof(int))
			{
			//交换
				exchange(cmp_int, base,sz, size, j);
			}
			else if(size == sizeof(struct Stu))
			{
				exchange(cmp_struct, base,sz, size, j);
			}
				flag = 0;
		}
			if (flag == 1)
			{
				break;//flag为1,即剩下的本就是正序,不需要再交换
			}
	}
}
void Print_int(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s ", arr[i]);
	}
}
void Print_Stu_name(struct Stu arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s ", arr[i].name);
	}
}
int main()
{
	struct Stu arr[] = {{"zhangsa",18},{"lisi",19},{"wanwu",20}};
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz,sizeof(arr[0]) );
	if (sizeof(arr[0]) == sizeof(int))
	{
		Print_int(arr, sz);
	}
	else if (sizeof(arr[0]) == sizeof(struct Stu)) 
	{
		Print_Stu_name(arr, sz);
	}
	return 0;
}
VB摄像头监控 该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制 立即下载

相关推荐

完整指南:从基础到高级使用 Semantic Kernel

通过本文的学习,你已经掌握了从基础到高级的使用方法。安装并配置。使用简单的文本生成和自然语言处理任务。利用任务链和工具扩展构建复杂的工作流。通过记忆管理上下文,创建更智能的应用。扩展多模态处理能力,集成图像和音频分析。将应用部署到云端,并通过 Azure Functions 提供智能服务。无论是构建简单的对话应用,还是创建多模态智能服务,都提供了强大的工具和灵活的扩展机制。希望这篇文章能帮助你更好地理解并运用这个框架,构建出更加智能和高效的应用。

net core ,前端 ,python 全栈开发 2806

【C语言】冒泡排序及使用回调函数方法

运用循环的方法,从左到右相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。一个通过函数指针调用的函数,如果把函数指针(地址)作为参数传递给另一个函数,这个指针被用来调用其指向的函数时,就叫回调函数。用回调函数模拟实现qsort,采用冒泡方式。

xiaofann_的博客 270

STM32硬件SPI调试ADS1256的3个致命坑,CubeMX配置避坑指南

本文深入解析STM32硬件SPI调试ADS1256高精度ADC芯片时常见的3大配置陷阱,包括SPI时钟频率、时钟极性与相位、数据字节序等关键问题。通过CubeMX实战配置指南和实测数据对比,提供稳定可靠的解决方案,帮助开发者避免常见错误,提升采样精度和系统稳定性。

weixin_42550597的博客 346

qsort函数详解及模拟实现

介绍了qsort函数的使用和模拟实现

xiaokuer_的博客 1193

海康线扫相机平场矫正教程

1、白纸准备确保视野中有一张平整且无折痕的白纸,使其完全铺满相机的整个视野。2、行高设置将行高参数设定为 2048。3、灰度值控制相机端图像的灰度值应维持在 120 - 160 这个区间内。同时,最亮像素点与最暗像素点的灰度值差值不得超过 4 倍。在调整灰度值时,尽量开启增益功能。4、 图像模糊处理为减少白纸对平场矫正的影响,需将相机端获取的图像进行模糊化处理。具体操作是对镜头进行虚焦,使整体图像变得模糊。

T 2752

DC综合中set_dft_signal的实战配置与优化策略

本文深入解析了DC综合中set_dft_signal命令的实战配置与优化策略。文章从命令的核心作用出发,详细拆解了-view、-type、-usage等关键参数,并通过扫描使能与时钟门控的实战案例,展示了如何正确配置以实现测试模式下的功耗优化。同时,文章总结了高级优化策略、与低功耗流程的协同方法以及常见错误排查清单,旨在帮助数字芯片设计工程师构建高可测性、低功耗的稳健DFT基础。

weixin_28347369的博客 403

C语言---冒泡排序和qsort函数的应用

4 int (*compar)(const void*,const void*)是函数指针,指向的是两个元素的比较函数,比较函数用来比较两个数的函数大小,这个是根据不同类型数组进行排序时,由我们自行编写的。调用 cmp 比较相邻元素。

m0_65245374的博客 1264

ESP32设备驱动-直流电机与L298N电机驱动器

在本文中,我们将介绍如何使用ESP32通过L298N电机驱动器驱动直流电机。

视觉与物联智能 3595

模拟qsort函数实现冒泡排序的泛式编程

对于两个const,因为我们的比较函数是根据两个参数的大小进行比较,所以在过程中,我们是不可以改变参数的值,所以使用const进行修饰,使参数的值不允许发生改变。第三个参数为每个元素的大小,qsort为多类型排序,就会牵扯到不同类型的内存大小不同,这样函数就不知道每一个元素需要开多大的内存,所以需要传入数组元素的大小。第二个参数为数组中的元素数,对于排序,我们不仅仅要传进首元素的地址,函数还需要知道我们需要多少个同样大小的内存,所以需要传入数组的元素数量。根据官网的介绍,我们发现qsort是有4个参数的。

kuaiww的博客 747

论文阅读:Training language models to follow instructions with human feedback

这篇论文的目标是通过引入一种基于人类反馈的训练方法,来让语言模型更好地按照用户意图行事。这是因为大规模语言模型虽然强大,但有时候会生成不准确、有偏见或者对用户无帮助的内容,这说明它们和用户的需求之间存在一定的“错位”。论文提出了一个新方法,将 GPT-3 进行优化,称为示例数据与监督学习:让人类标注员生成一些正确行为的示例,并使用这些示例来初步优化模型。比较数据与奖励模型:让标注员比较模型生成的多个输出,并将其排序,从中学到模型输出的优劣规则。强化学习优化:基于这些规则,使用强化学习算法进一步优化模型。

CSPhD-winston的博客 1715

10、现代统计方法:趋势面分析、薄板样条与广义线性模型

本文系统介绍了空间预测建模中的三种现代统计方法:趋势面分析(TSA)、薄板样条(TPS)和广义线性模型(GLM)。详细阐述了每种方法的原理、实现步骤、参数优化与预测评估,并结合R语言代码示例展示了在实际数据中的应用。文章还提供了方法对比流程图与土壤湿度预测案例,帮助读者根据数据特征选择合适模型,提升空间预测的准确性与可靠性。

play7的博客 157

如何用冒泡排序模拟实现qsort函数

的算法名称的由来就是因为在排序的过程中,按照排序规则(升序或者降序),越小或者越大的元素会经过交换之后慢慢 “浮” 到序列的顶端,就如同水中的气泡一样最终会浮到顶端一样,所以起名为 “冒泡排序”。此函数的原理就是讲单个元素分为x份,x由单个元素大小决定,打个比方,一个int的大小为四个字节,也就是四个char,那么当我们在进行交换的时候,每个元素都会被分为四个部分依次交换。但,很遗憾的是,这种冒泡排序的使用范围很窄,从它的参数就可以看出,它只能排序整形的数组。2.下面是compare函数的实现。

2301_80005578的博客 726

华为OD机试:查找接口成功率最优时间段 (C/C++/Py/Java/JS/GO)

华为OD机试双机位C卷 查找接口成功率最优时间段,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。

qq_45776114的博客 4687

库函数qsort的使用和模拟实现(冒泡)

对于任意类型都能实现冒泡排序的实现的库函数qsort()和模拟实现qsort()函数

m0_68338525的博客 588

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

冒泡排序改造模拟实现qsort()函数

本文章讲述了如何让冒泡排序模拟是先qsort,以及复习了qsort的基本用法,和冒泡排序的基本原理。

2401_84477761的博客 674

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C语言函数序列之模拟qsort函数,进行冒泡排序

冒泡思想实现qsort函数(包含函数介绍、演示、模拟)

m0_72420568的博客 279

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【C语言】_使用冒泡排序模拟实现qsort函数

qsort采用快排实现,现使用冒泡进行模拟实现;关于排序,冒泡排序实现文章参考如下:【C语言】_冒泡排序及其优化思路-优快云博客关于qsort函数,具体使用方法文章参考如下:【C语言】_qsort函数-优快云博客。

m0_63299495的博客 972

qsort库函数详解

目录 一、qsort是什么? 二、qsort的功能? 三、qosrt函数详解 1.qsort函数的定义 2.qsort函数的传参 四、qsort的模拟实现(冒泡) 1.如何实现交换? 2.如何实现字节之间的交换 一、qsort是什么? qsort是C语言库函数里面的一种,包含于#include <stdlib.h>这个头文件里面。 二、qsort的功能? qsort英语解析:Quick sort,翻译就是快速排序,它的内部实现是通过的快速排序算法来实现的。

weixin_63246064的博客 7708

C语言排序:冒泡排序 , qsort函数

前言这篇文章中你能学习到冒泡排序的思想,以及它的实现方式。了解到qsort()函数的使用,以及怎么用冒泡排序的实现模拟实现qsort()函数。这篇文章需要掌握一定的指针知识,如果有不够熟悉指针的朋友可以看看我往期指针的文章,有助于加深理解。

AuYu_的博客 336

【C语言库函数】回调函数的应用qsort函数的模拟实现

qsort函数是C语言的一个库函数,它的头文件是stdio.h,这个函数的底层是用的是快速排序的思路,这个函数可以用来排序任何数据。

kk702392702的博客 269

【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序

【排序】什么都能排C语言的qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序。超级详细的宝藏教程,干货满满啊不要错过!不收藏必后悔系列

系统编程、网络编程 2477

C语言函数指针与回调函数实战:从计算器重构到qsort模拟实现

在C语言程序设计中,函数指针是一种指向函数入口地址的变量,它允许程序在运行时动态选择要执行的代码。其核心原理是将函数地址存储在指针变量中,通过指针间接调用函数,从而实现代码的灵活调度。这一机制的技术价值在于实现了算法逻辑与具体实现的解耦,显著提升了代码的模块化程度和可复用性。在工程实践中,函数指针数组可用于构建清晰可扩展的指令集,例如重构计算器以替代冗长的switch-case语句;而回调函数则支持通用算法的设计,典型应用如C标准库中的qsort排序函数,它通过用户提供的比较函数实现对任意数据类型的排序。本

weixin_34335458的博客 431

回调函数( qsort函数为例)

1.回调函数:回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另一个函数, 当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。 回调函数不是直接由该函数的实现方直接调用, 而是在特定的事件或条件时由另外的一方调用, 用来对该事件或条件进行响应 2.qsort函数(基于任意类型数据排序的函数): void qsort(void* base,size_t n...

unique_IT的博客 569

冒泡排序函数进阶(模拟qsort)

以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

m0_73903710的博客 132

C语言-回调函数与qsort库函数的模拟实现

C语言-回调函数与qsort库函数的模拟实现

TPON的博客 1296

qsort函数

qsort函数的使用及其模拟实现

Rainai的博客 191
上一篇: 扫雷游戏(简易版,正在改进中)
下一篇: strlen函数的易错点
丰川祥子258
博客等级 码龄1年 4粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值