qsort的使用

2023-05-16

一、了解qsort

(1)编译器函数库万能数组排序函数排序函数。

它是基于快速排序算法,所以是q sort。q 指的是 quick。快速

qsort 的函数原型是

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

各参数:

base :  待排序数组首地址,通常该位置传入的是一个数组名
num: 该数组的元素个数
width: 该数组中每个元素的大小(字节数)
(*compar)(const void *, const void *) : 此为指向比较函数的函数指针,决定了排序的顺序。正序或倒序。

二、compar参数

这里的compar是一个回调函数。

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

所以注意这里的这个参数是一个指针。

compar只是一个函数名,你可以自己定义随意一个名字,但实现的内容是决定qsort所排序的顺序是从大到小还是从小到大。

//C语言

//compar的创建
int compare(const void* min,const void* max) {
	return (*(int*)max > *(int*)min);//从大到小
}

//这是一个 int 类型的函数。你需要根据数组的类型来修改这个函数的类型

      !!!!正确编写compar函数是实现qsort主要的环节 !!!!

三、常见的使用例子

这里举一个常见排序的例子,帮助理解。

//C语言

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int compare(const void* min,const void* max) {
	return (*(int*)max > *(int*)min);
}
void main() {
	int arr[] = { 10,30,40,90,80,45,75,97,122,84 };
	int sor = 0;
	qsort(arr,10,4,compare);
	while (sor<10)
	{
		printf("%d\t",arr[sor]);
		++sor;
	}
	printf("\n");
	system("pause");
}

四、排序各种类型的数据。

上面写的例子只是一个简单的例子,实现一个int型的数组排序。但是如果是一个字符数组呢?或者字符串数组呢?这里指的注意的就是传变量大小size的时候,应该传多大。下面来介绍。

字符数组的排序

//C语言

//字符数组的排序
int compare_ch(const void* min,const void* max) {
	return (*(char*)max > *(char*)min);
}

void main() {
	
	int sor = 0;
        char arr[] = { 'a','k','r','e','g','l' };
	qsort(arr,sizeof(arr),1,compare_ch);//元素大小是 1 !
	while (sor<6)
	{
		printf("%c\t",arr[sor]);
		++sor;
	}
	printf("\n");
	system("pause");
}

字符串的排序

//C语言
int compare_str(const void* min,const void* max) {
	return (*(char**)max > *(char**)min);
}
int main() {
	int sor = 0;
	char* str[] = { "i","am","a","student" };
	qsort(str,4,7,compare_str);
	while (sor<4) {
		printf("%s ",str[sor]);
		++sor;
	}
	printf("\n");
	return 0;
}

五、冒泡实现qsort原理

//C语言


void swap(char* one, char* other, size_t width) {
	size_t temp = 0;
	while (temp < width)
	{
		char some = *one;
		*one = *other;
		*other = some;
		++one;
		++other;
		++temp;
	}
}
int compare(const void* min,const void* max) {
	return *(char*)min > *(char*)max;
}
void bubble_sort(void* any,size_t num,size_t width, int(__cdecl*compare)(const void*, const void*)) {
	size_t row = 0;

	while (row < num)
	{
		size_t col = 0;
		while (col < num - 1 - row)
		{
			if ((compare((char*)any + col * width, (char*)any + (col + 1)*width)) > 0) {
				swap((char*)any + col * width, (char*)any + (col + 1)*width, width);
			}
			++col;
		}
		++row;
	}
}


 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qsort的使用 的相关文章

  • 浅谈C/C++排序函数中cmp()比较函数的写法(qsort sort函数)

    转自 http blog csdn net lionel d article details 41746135 首先 xff0c 我们来谈谈大名鼎鼎的void qsort void base int nelem int width int
  • 指向常数的“万能”指针:const void*在qsort的应用

    qsort函数 函数的原型 xff1a void qsort void base size t num int comparator const void const void 参数解释 xff1a 很简单理解 xff0c 第一个参数就是待
  • C语言qsort的三种使用

    1 结构体的qsort include lt stdlib h gt include lt stdio h gt struct block int att1 int att2 int cmp const void a const void
  • qsort的使用

    一 了解qsort xff08 1 xff09 编译器函数库万能数组排序函数排序函数 它是基于快速排序算法 xff0c 所以是q sort q 指的是 quick 快速 qsort 的函数原型是 void qsort void base s
  • 在 C 中使用 qsort 对字符数组进行排序

    我正在尝试使用qsort对字符数组进行排序 我不明白为什么这不起作用 我有一个指向比较函数的指针man页指定 有人可以告诉我出了什么问题吗 谢谢 我的代码 include
  • 如何在 C 中对指向 char 的指针数组进行 qsort?

    假设我有一个指向 C 中 char 的指针数组 char data 5 boda cydo washington dc obama 我希望使用 qsort 对该数组进行排序 qsort data 5 sizeof char compare
  • qsort 函数比较让我困惑

    我看到很多人在 qsort 比较器函数中使用减法 我认为这是错误的 因为在处理这些数字时 int nums 2147483648 1 2 3 INT MIN 2147483648 int compare const void a const
  • stdlib的qsort是递归的吗?

    我读过qsort只是一种通用排序 不承诺实施 我不知道库在不同平台上有何不同 但假设 Mac OS X 和 Linux 实现大致相似 are the qsort递归实现和 或需要大量堆栈 我有一个大数组 数十万个元素 我想对它进行排序 而不
  • 关于C中的qsort(),** buf和buf[][]的区别

    当我在 Mac 上的 C 语言中使用 qsort 时 这些代码运行良好 它可以很好地对一个文件中的每一行进行排序 int compare const void p const void q return strcmp p q void fu
  • 需要帮助将 qsort 与结构数组一起使用

    现在 我看到了各种例子 但我不明白它们的意思 这是我的结构 typedef struct profile char gender 1 double soc PROFILE 其中 soc 是我要排序的社会安全号码 我知道你需要一个比较函数 但
  • 解释 qsort 库中使用的函数的 typedef

    我正在使用 qsort 库函数对结构元素数组进行排序 在互联网上搜索时我发现了一个资源 信息 使用 C qsort 函数对结构进行排序 support microsoft 我知道 qsort 函数需要通过通用指针进行类型转换 但是我无法得到
  • qsort 给出 [错误]:从 `int (*)(cricketer*, cricketer*)' 到 `int (*)(const void*, const void*)' 的无效转换

    这是代码 它按平均跑数对板球运动员的数据进行排序 这qsort函数显示错误 错误 C Users Encoder Documents C Free Temp Untitled3 cpp 29 错误 无效的转换int cricketer cr
  • 为 qsort 的结构编写比较函数?

    我在编写比较函数时遇到问题qsortC 中的函数 这是我目前拥有的 int cmpfunc const void a const void b return Individual a gt fitness Individual b gt f
  • 为什么 qsort 中的排序方法改变了我的数组?

    https phaxis org 2012 07 12 get sorted index orderting of an array https phoxis org 2012 07 12 get sorted index ordertin
  • 转换函数指针

    我正在编写一个函数 它接收一个指向比较函数的指针和一个数组MyStructs并应该根据比较函数对数组进行排序 void myStructSort struct MyStruct arr int size int comp const str
  • 对数组 C 进行部分排序

    我有一个如下所示的数组 int array 4 53 3 65 7 43 9 54 0 72 0 0 我只是想知道我可以使用什么方法对该数组进行部分排序 以将前三个最大的双精度数放在前面 我正在寻找最有效的方法来获取该数组中前三个最高的数字
  • Qsort 在 C++ 中不适用于哪些类型?

    std sort通过使用交换元素std swap 它又使用复制构造函数和赋值运算符 保证您在交换值时获得正确的语义 qsort通过简单地交换元素的底层位来交换元素 忽略与要交换的类型相关的任何语义 虽然qsort尽管不了解您正在排序的类型的
  • c 中 qsort() 函数中的 cmpfunc

    有人可以解释一下吗cmpfunc这是用在qsort功能 什么是a and b在这个函数中 它们指向什么 int cmpfunc const void a const void b return int a int b a and b in
  • 解释一下c中qsort()函数的类型转换? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 1 在这段代码中pLhs and pRhs指向某个随机内存位置 那么如何将该随机内存位置的内容复制到 LHS 指向的位置 2 解释使用的比较
  • 对 Qsort 和指针感到困惑

    我是一名 C 初学者程序员 想要习惯术语和指针 我在寻找对数值数组元素进行排序的方法时发现了以下工作函数原型 该函数是 qsort 它使用指针 现在我的理解是 const 一词确保值 a 和 b 不变 但指针不变 如果我在这里错了 请纠正我

随机推荐

  • freertos通讯---信号量与队列

    哈喽 又见面了 一 信号量 1 1创建二进制信号量 define xSemaphoreCreateBinary xQueueGenericCreate UBaseType t 1 semSEMAPHORE QUEUE ITEM LENGTH
  • 关于python调用C++

    关于python调用C C 43 43 查了很多相关资料 xff0c 可以通过ctypes模块 SWIG等一些方法 简单的类似单个头文件单个cpp文件都可以实现 xff0c 但是大恒给的C 43 43 包含驱动程序 xff0c 需要在属性里
  • freertos通讯-通知

    通知是什么 xff1f 其实我们之前就见过 它就在任务结构体中 再来回顾下 if configUSE TASK NOTIFICATIONS 61 61 1 volatile uint32 t ulNotifiedValue volatile
  • freertos软件定时器

    哈喽 这篇文章是freertos解析的最后一篇文章 我们将会讲解一个利用任务延时实现的软件定时器 1 创建 timer结构体和创建一目了然 看看初始化函数 是不是有点熟悉 timer的管理有点类似任务的管理 如果是第一次创建则初始化time
  • 蓝牙5.1的ble那些事儿

    既然要说5 1的那些事儿 那么必须的聊聊蓝牙4 0 本文就不在此长篇大论班门弄斧了 要了解4 0的同学请出门左拐直接去参考蜗窝科技大佬的文章 本人觉得对于想入门全面了解4 0的同学 此文章是不二选择的经典 在此只有膜拜的份了 不是广告哈哈
  • 蓝牙5.1的ble那些事儿

    到这里 对于非连接状态应该有一些新的认识了 接下来 顺其自然当然就是连接了 你谈对象 忙活半天 当然是想干点什么事情了 当然也有老司机翻车 连接上后 一端要主动向另一端发起问候 否则长时间不联系 那么就断开好了 主动问候的一端我们称之为ma
  • Http auth认证的两种方式Basic方式和 Digest认证

    Http Basic Auth 方式 当访问一个Http Basic Auth 网站的时候需要提供用户名 xff0c 密码 xff0c 否则会返回401 without authoration Http Basic Authenticati
  • while无限循环

    无限循环写法while 1 循环体内部可以用break语句跳出循环 while 1
  • 不同操作系统下的程序入口点分析

    转自 http hi baidu com liu bin0101 blog item 03e3a9ec4e0fd5d72e2e21b9 html 程序入口与编译器没有什么关系 关键是链接链接器 UNIX的用的ld和WINDOWS下用的LIN
  • rv-player 不靠谱之rvio

    最近忽然发现为动画组写过的一个maya内置工具不能用了 xff0c 工具的作用是使用rvio hw exe转换playblast出的tif序列图 xff0c 生成带watermark的mov文件 之前在Maya2013上一直用的好好地 xf
  • 树莓派 Raspberry Pi SD卡系统备份与还原

    近半年时间用来监控陆龟的树莓派 Raspberry Pi 还算稳定 xff0c 可到了冬天龟箱里的加热灯长时间加热导致树莓派温度很高 xff0c 时不时的自动重启 如果每次都能正常起来也就罢了 xff0c 可偶尔会挂不上SD卡的文件系统直接
  • 2022-12-18 CMakelists指定CMAKE_BUILD_TYPE为Debug或者Release

    今天编译代码的时候遇到古怪的事情 xff0c 在Cmakelists txt中指定了编译版本 xff0c build的时候输出一句 xff1a cpptools The build configurations generated do n
  • 5.FreeRTOS任务切换的简易分析

    FreeRTOS任务切换的简易分析 架构 xff1a Cortex M3版本 xff1a FreeRTOS V9 0 0前言 xff1a 之前分析了创建任务 启动调度器 xff0c 在做完这些工作后 xff0c 就是该完成所有RTOS的最核
  • vue.js:634 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever t

    其实是前两天了解了v mdel的原理 lt v model原理 gt lt div id 61 34 demo 34 gt lt input value 61 34 value 34 64 input 61 34 price 61 even
  • vscode终端加git的方法

    记录一下 xff0c vscode添加git终端的方法 1 先打开首选项 61 gt 设置 xff0c 搜 shell window xff0c 然后找到setting json 2 添加代码 xff08 设置git的位置 xff0c 以及
  • jquery的简单介绍

    jQuery也包含了对ajax的封装 什么是jQuery jQuery是一门轻量的 免费开源的JS函数库 xff0c 主要作用是用于简化JS代码 轻量的 xff1a 代码或项目对该技术的依赖程度 xff0c 依赖程度越低 xff0c 这个技
  • 图像质量评估(2) -- 图像质量相关参数:分辨率

    分辨率 xff08 解析度 xff0c Resolution xff09 分辨率使我们经常听到的一个词 xff0c 它代表了图像的精细程度 xff0c 也代表了图像的大小 分辨率决定了在这种大小下 xff0c 输出信号是否能够包含足够多的信
  • 图像质量评估(5) -- 畸变(Distortion)

    当图像中原本应该是直线的地方看起来发生了不自然的变形或扭曲时 xff0c 我们称为图像畸变 有三种类型的镜头畸变 xff1a 桶形畸变 xff08 后文使用英文barrel xff09 xff0c 枕形畸变 xff08 后文使用pincus
  • FreeCMS视频教程 将FreeCMS导入eclipse

    项目地址 xff1a http www freeteam cn 原文地址http www freeteam cn site FreeCMS videos info 2016 5670 html
  • qsort的使用

    一 了解qsort xff08 1 xff09 编译器函数库万能数组排序函数排序函数 它是基于快速排序算法 xff0c 所以是q sort q 指的是 quick 快速 qsort 的函数原型是 void qsort void base s