【c语言】qsort函数:C语言标准库中的排序利器

别再手写排序和二分了!C语言刷LeetCode必备的qsort和bsearch库函数实战指南 本文深入解析C语言标准库中的qsort和bsearch函数,提供在LeetCode刷题和算法竞赛中的高效应用指南。通过对比手写实现与库函数的优劣,详细讲解排序、查找的高阶技巧,包括复杂数据结构处理、多级排序和边界条件优化,帮助C语言开发者提升刷题效率与代码质量。 阅读详情

前言

在C语言的标准库中,有很多实用的函数可以为我们节省大量的开发时间和精力。其中一个非常重要且广泛使用的函数就是qsort()。qsort()函数是一个强大的排序函数,可以对各种类型的数据进行排序。在本篇博客中,我们将深入了解qsort()函数的用法和原理。
在这里插入图片描述

1.qsort()函数的声明

#include <stdlib.h>//所需头文件
void qsort(void* base, size_t num, size_t size, int (*cmp)(const void* e1, const void* e2));

该函数接受四个参数:

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

  • num:待排序数组的元素个数。

  • size:每个元素的大小(字节数)。

  • cmp:比较函数的指针。
    比较函数 cmp 是 qsort()函数的核心所在。它定义了排序的规则,告诉qsort()函数如何比较数组中的元素。比较函数需要满足以下条件:

  • 它返回一个整数值,该值表示两个元素的比较结果:

如果返回值小于0,表示第一个元素应该排在第二个元素之前。
如果返回值大于0,表示第一个元素应该排在第二个元素之后。
如果返回值等于0,表示两个元素相等,它们的相对顺序可以是任意的。

  • 比较函数的参数为指向待比较元素的指针。

2.如何进行比较

为了说明qsort()函数的使用方法和原理,让我们通过一个示例来解释。假设我们有一个整型数组,我们想按照从小到大的顺序对它进行排序。首先,我们需要定义一个比较函数:

int cmp_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

上述比较函数将两个待比较元素的地址强制转换为 int* 类型,然后比较两个整型数值的大小。接下来,我们可以调用qsort()函数对整型数组进行排序:

void test_int()
{
	int arr[] = { 2, 4, 5, 6 ,5, 3 ,-1, 9 };
	int num = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, num, sizeof(int), cmp_int);
	for (int i = 0; i < num; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

在上述示例中,我们首先定义了一个整型数组 arr,包含了一些无序的整数。然后,我们计算出数组元素的个数,并将这些信息作为参数传递给qsort()函数,同时还传递了比较函数 cmp 的指针。最后,我们打印排序后的结果。

通过这个例子,我们可以深入理解qsort()函数的用法和原理。它是一个非常强大且灵活的排序函数,可以适用于不同类型的数据排序。只需定义相应的比较函数,即可实现对各种类型的数据排序。

3.其它类型的排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//void qsort(void* base, //待排序数组的第一个元素的地址
//	       size_t num, //待排序数组的元素个数
//	       size_t size,//待排序数组中一个元素的大小
//	       int (* cmp)(const void* e1, const void* e2)//函数指针-cmp指向了一个函数,这个函数是用来比较两个元素的
//         //e1和e2中存放的是需要比较的两个元素的地址
//          );
//1. 排序整型数组, 两个整型可以直接使用>比较
//2. 排序结构体数组,两个结构体的数据可能不能直接使用>比较
// 也就是不同类型的数据,比较出大小,方法是有差异的
//

//测试qsort排序结构体数据
struct Stu
{
	char name[20];
	int age;
};
//结构体数据怎么比较呢?
//1. 按照年龄比较
//2. 按照名字比较

int cmp_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

int cmp_char(const void* p1, const void* p2)
{
	return *(char*)p1 - *(char*)p2;
}


int cmp_stu_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

int cmp_stu_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p1)->name);
}


void test_struct()
{
	struct Stu arr[] = { {"张三", 17}, {"张无", 15}, {"李四", 20}, {"王五", 16}};
	int num = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, num, sizeof(struct Stu), cmp_stu_by_age);
	for (int i = 0; i < num; i++)
	{
		printf("%s %d, ", arr[i].name, arr[i].age);
	}
	printf("\n");
	qsort(arr, num, sizeof(struct Stu), cmp_stu_by_name);
	for (int i = 0; i < num; i++)
	{
		printf("%s %d, ", arr[i].name, arr[i].age);
	}
}



//测试qsort排整型数据
void test_int()
{
	int arr[] = { 2, 4, 5, 6 ,5, 3 ,-1, 9 };
	int num = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, num, sizeof(int), cmp_int);
	for (int i = 0; i < num; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

//测试qsort排序结字符数据
void test_char()
{
	char arr[] = { 'd', 't','Q', 'n' ,'r', 'b' ,'k', '*' };
	int num = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, num, sizeof(char), cmp_char);
	for (int i = 0; i < num; i++)
	{
		printf("%c ", arr[i]);
	}
	printf("\n");
}

int main()
{
	test_int();
	test_char();
	test_struct();
	return 0;
}

4.关于void*

//void* 类型的指针 - 不能进行解引用操作符,也不能进行+-整数的操作
//void* 类型的指针是用来存放任意类型数据的地址
//void* 无具体类型的指针
//
//int* char* 指针类型



int main()
{
	char c = 'w';

	char* pc = &c;

	int a = 100;
	//int* p = &c;
	//       char*
	void* pv = &c;//char*
	pv = &a;//int*

	return 0;
}

总结:

本篇博客深入介绍了C语言标准库中的qsort()函数,它是一个非常实用的排序函数。我们了解到qsort()函数的四个参数及其使用方法,并着重介绍了比较函数的编写和使用。通过正确定义比较函数,我们能够对不同类型的数据进行排序。

掌握了qsort()函数的使用方法之后,我们可以在日常编程中更加高效地进行排序处理。希望本篇博客能够帮助读者深入理解qsort()函数,并在实际项目中充分发挥其排序的优势。

别再自己写冒泡排序了!C语言qsort函数实战指南(附LeetCode刷题技巧) 本文详细介绍了C语言中qsort函数的高效使用方法,帮助开发者避免手写冒泡排序的常见错误。通过实战示例和LeetCode刷题技巧,展示了qsort在算法竞赛中的优势,包括处理整型数组、字符串和自定义结构体的排序。文章还提供了比较函数的编写模板和性能优化建议,助力开发者提升编程效率。 阅读详情

相关推荐

QT排序函数深度解析:qSort、qStableSort与qPartialSort实战指南

排序是数据处理中的基础操作,其核心原理是通过比较和交换元素位置,使数据集合按照特定规则有序排列。在C++开发中,标准库提供了std::sort等通用算法,但在QT框架下,针对其特有的容器和内存管理机制,使用专门的排序函数能带来更好的性能和安全性。QT的qSort、qStableSort和qPartialSort函数不仅封装了高效的排序算法,还深度集成了隐式共享(Copy-On-Write)机制,这对于处理包含QObject派生类或复杂数据结构的容器至关重要。理解这些函数的差异,能帮助开发者在GUI数据处理、

weixin_30367169的博客 483

【C语言】数组排序方法总结

一.冒泡排序 相邻元素两两比较,按照要求交换位置,n个元素一共要比较n-1趟,每趟要两两比较未排序元素个数-1次。 #include<stdio.h> void bubble_sort(int* p, int len)//函数实现 { int i = 0; int j = 0; for (i = 0; i < len - 1; i++)//需要进行len-1趟 { int flag = 1;//flag=1,说明已经排好序 for (j = 0; j < len -

m0_51064412的博客 2万+

XTU OJ聚会问题解析:如何用C语言实现快速排序与条件判断

本文以XTU OJ中的“聚会问题”为例,深入解析如何运用C语言实现快速排序与精确的条件判断。文章对比了使用标准库qsort函数与手写快速排序的优劣,并详细阐述了将问题逻辑转化为代码的核心步骤,旨在帮助读者构建解决排序与条件筛选类问题的通用算法思维框架。

weixin_29289821的博客 315

C语言中排序函数的用法

C语言中没有预置的sort函数。如果在C语言中,遇到有调用sort函数,就是自定义的一个函数,功能一般用于排序。 一、可以编写自己的sort函数。 如下函数为将整型数组从小到大排序。 void sort(int *a, int l)//a为数组地址,l为数组长度。 { int i, j; int v; //排序主体 for(i = 0; i < l - 1; i +

佳梦作快马 诗酒趁年华 2万+

C++排序算法深度解析:qsort与std::sort的核心差异与实战选型

排序算法是计算机科学中的基础概念,用于将数据集合按照特定规则重新排列,是数据处理和算法优化的核心环节。其原理基于元素间的比较与交换,通过不同的策略(如分治、递归)实现效率与稳定性的平衡。在C/C++编程领域,排序算法的技术价值体现在性能优化、资源管理及类型安全等多个层面,直接影响程序的正确性与效率。qsort作为C标准库函数,采用函数指针实现泛型,灵活但存在类型安全隐患;而C++ STL中的std::sort基于模板与迭代器,通过内省排序算法保证最坏情况下的O(n log n)时间复杂度,并支持Lambda

weixin_30582943的博客 264

C语言指针进阶:函数参数、函数指针与回调函数实战解析

在C/C++编程中,指针是理解内存管理和程序架构的核心概念。其本质是存储内存地址的变量,通过解引用操作可直接访问或修改目标数据。这一特性赋予了程序直接操作内存的能力,是实现高效、灵活软件设计的技术基础。从技术价值看,指针不仅支持动态内存分配,更是实现函数间数据共享、构建通用算法和事件驱动架构的关键。在应用场景上,指针作为函数参数可实现地址传递,允许函数修改外部变量或高效传递大型数据;函数指针则将函数视为数据,支持运行时动态调用,是实现回调函数、插件系统和状态机的基础。本文聚焦于指针参数传递的本质、函数指针的

weixin_30920513的博客 431

C语言标准库函数qsort( )——数据排序

大家好!我是保护小周ღ,本期为大家带来的是深度解剖C语言标准库函数 qsort(),qsort()函数他可以对任意类型的数据排序,博主会详细解释函数使用方法,以及使用快速排序的左右指针法模拟实现函数功能,这样的排序确定不来学习一下吗???...

保护小周ღ的博客 1万+

【自动驾驶控制算法】 第一讲 绪论

声明【自动驾驶控制算法】系列是博主对所分享教学内容的学习笔记,并且该系列每篇博客都会将博主听课后总结的纸质版笔记附于文末,供大家参考。是一位研究汽车领域,无人驾驶方向及其相关方向的大佬,也算是博主在无人驾驶方向的启蒙老师。所以研究相关领域的朋友推荐去听一听他的视频讲解。...

iamtbon_1的博客 1796

c语言中四种简单的数组排序

c语言中四种数组排序方式

wsbydmm的博客 2万+

别再自己写组件了!用uni-app的midButton属性5分钟搞定中间凸起TabBar(H5/小程序通用)

本文详细介绍了uni-app官方提供的midButton属性,帮助开发者5分钟内实现中间凸起的TabBar效果,无需编写繁琐的自定义组件代码。该方案兼容H5和微信小程序平台,配置简单且维护成本低,大幅提升开发效率和性能表现。

weixin_30431445的博客 347

三菱PLC软件GX-Works2使用和循环左移指令实现流水灯程序

(2)方式2:双击打开全局软元件注释,软元件名称手动输入,如M辅助继电器输入M0、D寄存器输入D0,然后找到对应的寄存器输入自定义的功能名字即可。链接:https://pan.baidu.com/s/14ZaBIq4mBirIqfd9Ja3AiA。链接:https://pan.baidu.com/s/1nuQz1OgS8bmagPE8T-PBkQ。链接:https://pan.baidu.com/s/1oKGi_bdLN5HI4HYxSXEdlA。(1)方式1:将定义好变量功能的CSV文件导入即可。

panjinliang066333的博客 1万+

C语言基础-数组,排序,函数

计算数组内元素的个数,利用sizeof求出整个数组的内存空间大小和一个元素的内存空间大小,两数相除即可得出数组内元素的个数。生命周期,被调用时才为形式参数申请内存,调用结束,内存被系统释放。(编程便捷,但是有风险,所有函数都可以操作,多线程)在对全部数据赋值时,中括号内的元素个数可以省略不写(如下代码,5即可不写)-由整数赋值给小数时,需要强转,强转类型写在括号内。1、首先定义三个方法函数,输入成绩,打印成绩,计算平均值。三、一维数组作为函数的参数,数组值传递的问题(难点)-参数列表中数组传递的是。

qq_52902991的博客 2639

仪表数字图像识别的传统方法

虽然现有很多机器学习算法能够准确地识别数字,但是传统方法对于一些需要离线识别且计算能力有限的下位机设备来说,仍然有非常不错的效果。因此,今天就向大家讲解一下传统的数字识别方法在仪表读数方面的应用。 1.图像预处理技术 1.1 主要流程 图像处理依次需要进行图片预处理、字轮区域定位、字符分割和字符识别等过程。其中图像处理流程如下图所示。 2. 详细过程 2.1 灰度化 为了减小图像原始数据量,本系...

XYZ 4523

排序算法还在手写?万能排序神器qsort函数,搞定90%笔试面试!

排序算法还在手写?万能排序神器qsort函数,搞定90%笔试面试!

萧邯嵌入式笔记 1161

从零搭建无人机仿真环境:ROS 2与Gazebo Fortress实战指南

本文提供了一份详细的无人机仿真环境搭建实战指南,基于Ubuntu 22.04系统,整合ROS 2 Humble与Gazebo Fortress两大核心工具。通过分步讲解安装、配置及桥接过程,并引入PX4飞控与XTDrone2工具链,帮助开发者快速构建一个稳定、高效的无人机算法开发与测试平台,有效降低真机测试的成本与风险。

water的专栏 428

基于 YOLOv26 的食品包装缺陷检测系统:智能视觉质检方案

本文提出了一种基于YOLOv26深度学习的食品包装缺陷智能检测系统。该系统能够自动识别多种常见包装缺陷,包括密封不良、破损、污染、标签错误等8类问题。相比传统人工检测方法,该系统具有高精度、多类别分类、实时推理等优势。文章详细介绍了系统架构,包含数据采集、预处理、YOLOv26检测模型和后处理四个核心模块,并提供了完整的环境配置和数据处理代码实现。该系统为食品包装行业提供了一种高效、准确的智能视觉质检解决方案。

一键难忘的博客 683

【C语言排序利器——qsort函数的介绍,使用,以及伪qsort底层实现】

我告诉我自己要涂自己喜欢的口红,我告诉我自己要好好生活。“我是说,我期待一个春天”qsort函数是一个用来排序的库函数,底层是用快速排序的思想实现的。这是来及cplusplus官网上对于qsort的介绍,链接放在这里,读者可自行阅读添加链接描述qsort函数原型如下头文件函数原型函数参数中文注解//以下为qsort函数原型,以及四个参数的介绍void qsort (void* base, //void *指针,指向待排序的数组的第一个元素(可理解为基础地址)

2301_80193863的博客 2184

configure: error: no acceptable C compiler found in $PATH解决方案

本文主要介绍了configure: error: no acceptable C compiler found in $PATH解决方案,希望能对使用Linux的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 4万+

探索C语言标准库中的qsort函数

函数是C语言标准库中一个强大的排序工具,通过灵活的比较函数,我们可以对各种类型的数组进行排序,包括一维数组、二维数组和结构体数组。这个函数是用于排序数组的利器,能够轻松地对一维数组、二维数组和结构体数组等不同类型的数据进行排序。函数对一维数组、二维数组和结构体数组进行排序时,关键是提供适当的比较函数。在C语言中,标准库提供了丰富的函数来支持各种操作,其中之一是。函数是C语言标准库中提供的一个用于排序数组的函数。函数的使用,包括一维数组、二维数组和结构体数组的排序示例。一个简单的示例,演示如何使用。

2302_78381559的博客 717

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C语言中巨好用的排列函数qsort

摘要:C标准库中的qsort函数是高效的快速排序实现,支持任意类型数组排序。其原型为void qsort(void* base, size_t nitems, size_t size, int (*compar)(const void*, const void*)),核心在于自定义比较函数。比较函数需注意避免整数溢出风险,推荐使用(num1>num2)-(num1<num2)的写法。文章提供了int数组、字符串数组和结构体数组的排序示例,展示如何实现升序/降序排列及按字段排序。

pengqinquan的博客 637

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

18. 【C语言】函数与指针的强强联合

如何把函数当作参数传给另一个函数(这正是回调的底层原理),如何用函数指针实现策略模式,以及那个让人头疼的“信号函数”声明到底怎么读。理解函数指针,你就推开了通往高阶 C 编程的一扇大门。

gugucoding的博客 375

假人有限元模型

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

17.10【保姆级教程】通用工具库:从程序善后到快速排序,新手必学的通用利器

文章摘要: 本文深入讲解C语言通用工具库(<stdlib.h>)中的三个关键函数: exit()与atexit(): exit()用于程序终止,比return更灵活,支持状态码(EXIT_SUCCESS/EXIT_FAILURE)。 atexit()注册退出时自动调用的清理函数,按注册逆序执行,适用于资源释放等收尾工作。 qsort()快速排序: 高效排序任意类型数组,需提供比较函数。 比较函数需返回整数:负值(a<b)、零(a=b)、正值(a>b),支持升序/降序和结构体排序。 实

BackCatK Chen的博客 428

C语言数组排序算法全解析:从冒泡到qsort的实战指南

排序算法是计算机科学中处理数据组织的核心基础,其核心原理是通过比较和交换(或移动)操作,将无序的数据序列调整为有序序列。理解不同算法的时间复杂度、空间复杂度和稳定性,对于编写高效程序至关重要。在C语言编程实践中,数组作为基础数据结构,其排序效率直接影响程序性能。本文聚焦于冒泡排序、快速排序等经典算法的C语言实现,深入剖析其代码细节与优化技巧,并结合嵌入式开发等实际场景,探讨如何根据数据规模与特征选择合适的算法,最终自然过渡到对C标准库qsort函数的深度解析与实战应用。

weixin_32390647的博客 226

别再自己写冒泡了!C语言qsort函数保姆级教程(附int、double、结构体排序代码)

本文详细解析C语言标准库中的qsort函数,提供从基础数据类型到结构体的多场景排序代码示例,并分享性能优化技巧。通过掌握这一快速排序利器,开发者可以告别手写排序算法,提升代码效率和可维护性。

weixin_42549723的博客 347

深入理解C语言指针:从基础到高级应用

本文系统讲解了C语言指针的核心概念与应用。首先阐述了指针的本质是内存地址的别名,详细解析了指针变量、解引用操作及指针大小的平台差异。第二部分强调了指针类型的重要性,包括解引用权限、算术步长差异以及void*指针的特殊性。接着深入探讨了数组与指针的关系,特别是一维/二维数组传参的本质。文章还介绍了函数指针、回调机制和转移表等高级用法,并通过模拟qsort函数展示了泛型编程的实现原理。最后总结了野指针的风险规避策略。全文从基础到进阶,结合代码示例,帮助读者全面掌握指针这一C语言核心特性。

weixin_69677458的博客 858
上一篇: 【c语言】函数指针数组 与 回调函数 在计算器程序上的应用
下一篇: 【C语言】库函数sprintf()函数 的妙用
Q_hd
Q_hd 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄6年 2058粉丝 194原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q_hd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值