C语言-qsort函数详解及使用例
q s o r t ( ) qsort() qsort() 函数是C语言 srdlib.h
库中的排序函数。此函数使用快速排序算法,时间复杂度一般在 O ( l g ( n ) ) O(lg(n)) O(lg(n)) 。因此是一种强大的排序方法。本文即介绍 q s o r t ( ) qsort() qsort() 函数及其使用方法。
qsort()的参数
q s o r t ( ) qsort() qsort() 函数中共包含四个参数。此函数的声明为:
qsort(void * Base, size_t _NumOfElements, size_t _SizeOfElements, _CoreCrtNonSecureSearchSortCompareFunction _CompareFunction)
。
接下来我们分别解释这四个参数。
void * Base
:第一个参数,要求传入的参数是一个指针。这个指针应当指向待排序数组。
size_t _NumOfElements
:第二个参数,传入待排序的元素个数。
size_t _SizeOfElements
:第三个参数,传入待排序元素类型的大小。一般而言,我们可以使用 sizeof(num[0])
来获取元素的大小。( num
是待排序的数组)
_CoreCrtNonSecureSearchSortCompareFunction _CompareFunction
:第四个参数,要求传入一个函数指针,这个函数的作用是比较两个元素大小。
专门解释一下第四个参数。这个函数接受两个元素,我们需要确定这两个元素之间的大小(通过返回值的正负确定)。qsort()
函数提供了排序的算法,我们需要做的就是提供元素间的比较方法。
qsort()的使用
最简单的,先从对两个整型排序说起:
#include <stdio.h>
#include <stdlib.h>
int num[100];
int n;
int cmp(const void* a, const void* b){int* pa = (int*)a;int* pb = (int*)b;return *pa - *pb;
}
int main(){scanf("%d", &n);for(int i = 0; i < n; i++)scanf("%d", &num[i]);qsort(num, n, sizeof(num[0]), cmp);for(int i = 0; i < n; i++)printf("%d ", num[i]);return 0;
}
对于 cmp()
这个比较函数,返回值和形式参数的声明是固定的。在比较的时候,我们需要首先将 const void*
类型的指针强制类型转换为我们需要的类型指针,之后再进行比较。返回值正负决定了 qsort()
的排序行为。
再举一个对二维数组排序的例子(对第一关键字进行升序排序,第一关键字相同时对第二关键字进行降序排序)。
#include <stdio.h>
#include <stdlib.h>
int num[100][2];
int n;
int cmp(const void* a, const void* b){int* pa = (int*)a;int* pb = (int*)b;if(pa[0] != pb[0])return pa[0] - pb[0];//对第一关键字排序elsereturn -(pa[1] - pb[1]);//对第二关键字排序
}
int main(){scanf("%d", &n);for(int i = 0; i < n; i++)scanf("%d%d", &num[i][0], &num[i][1]);qsort(num, n, sizeof(num[0]), cmp);for(int i = 0; i < n; i++)printf("%d %d\n", num[i][0], num[i][1]);return 0;
}
除此之外,我们也可以对自定义的结构体进行排序(对 i d id id 进行升序排序, i d id id 相同则对 v a l u e value value 进行升序排序):
对 double
类型的排序不能直接进行相减,而要用到三目运算符。在对大数字进行排序时,如果在对两个数字进行相减运算时可能会发生溢出,则也应该使用三目运算符的写法。
#include <stdio.h>
#include <stdlib.h>
typedef struct Stu Stu;
struct Stu{int id;double value;
};
Stu num[100];
int n;
int cmp(const void* a, const void* b){Stu* pa = (Stu*)a;Stu* pb = (Stu*)b;if(pa->id != pb->id)return pa->id - pb->id;else return pa->value - pb->value > 0 ? 1 : -1;//使用三目运算符传返回值。
}
int main(){scanf("%d", &n);for(int i = 0; i < n; i++)scanf("%d%lf", &num[i].id, &num[i].value);qsort(num, n, sizeof(num[0]), cmp);for(int i = 0; i < n; i++)printf("%d %lf\n", num[i].id, num[i].value);return 0;
}
实际上的使用是对复杂的结构体类型排序的情况居多。掌握好 qsort()
对我们编写程序有很大的帮助。
C语言-qsort函数详解及使用例相关推荐
- C语言-qsort函数详解
目录 一.qsort函数是什么 二.使用qsort排序-以升序为例 关于void*型指针: 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒 ...
- C语言 qsort()函数详解 (笔记)
qsort函数,其声明在stdlib.h文件中,时间复杂度为n*log(n). 功能:使用快速排序例程进行排序 用法: void qsort(void *base, size_t nitems, si ...
- C语言 - qsort函数详解
文章目录 一.qsort函数简介 1.qsort函数是C标准库<stdlib.h>库中的函数,使用时引入#include <stdlib.h>.** 2.它的函数原型是 voi ...
- C语言qsort函数详解
目录 一.qsort函数的使用 二.qsort函数的模拟 一.qsort函数的使用 快排函数qsort是C的库函数,它可以对输入的任何类型的数组排序,通过该函数的函数声明我们可以看出它的使用方法: 举 ...
- 【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序
[排序]什么都能排的C语言qsort排序详解[超详细的宝藏级别教程]深度理解qsort排序 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客之前,博主在这里 ...
- 冒泡排序和qsort函数详解以及如何模拟实现qsort函数
一.冒泡排序 冒泡排序是一种常见的排序方式,它可以把数组元素有序或无序的数组进行重新排序,并使得数组中的元素从大到小或从小到大进行排序(就像泡泡一样). 冒泡排序原理: 每次比较数组中的相邻的两个元素 ...
- qsort函数详解以及模拟实现
qsort函数详解以及模拟实现 一.qsort函数是什么 二.具体的使用 1.参数4(参数3在模拟实现时解释) 2.例子 1.排序整形 2.排序结构体 三.模拟实现qsort 1.参数3 2.模拟排序 ...
- c语言memset对应java,C语言memset函数详解
C语言memset函数详解 memset() 的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零. 它是直接操作内存空间,mem即"内存"(memory)的意思. ...
- R语言which函数详解以及Rcpp改写
R语言which函数详解以及Rcpp的改写 引言 which 函数的介绍 which函数的一些小例子 1 2 which函数的改进以及时间对比 引言 首先来介绍一下R语言which函数的作用:whic ...
最新文章
- IEEE 发布年终总结,AI 奇迹不再是故事
- 【转载】FckEditor 2.6.3 for Java 2.4 配置
- 优化JMeter自身性能
- mysql怎么显示结果窗口_mysql8中窗口函数
- C# 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集...
- 学习java 第三天 数据类型以及存储大小取值范围 (one 大白 (●—●))
- 编程实现strcpy函数_C编程中的strcpy()
- 基于WPF系统框架设计(7)-TextBox/PasswordBox在ViewModel中支持回车命令
- 三句话教你买对房子!买到好房子的都祝福哥三年内赚两个亿!
- 封装kmalloc/malloc的一些小函数
- 锐捷客户端显示无法连接认证服务器,锐捷客户端连接失败怎么办 锐捷连不上解决办法...
- 分享工作上的一些体会
- 只要花3K 手把手教你制作炫酷的MR混合现实视频
- oracle如何异地备份软件,数据库Oracle数据的异地的自动备份
- 高数 | 为什么f(x)从a到b的积分等于从b到a的积分的相反数?
- 工业机器人与计算机控制,不懂工业机器人控制技术?那你一定是没看过这篇文章...
- 打造属于自己的TensorFlow(一)之SimpleFlow-计算图与前向传播
- 被吹爆的性能强者FastAPI,实际性能不到Flask一半
- .py与.pyc文件的区别
- Oracle数据库学习(一):Oracle 11g数据库下载及安装
热门文章
- FPGA:什么是IO单元、IO标准、Bank、VCCO、VREF
- 【EE308FZ Lab2-1】Android App for Bobing (Prototype)
- [转]Windows CE 6.0(PB6)离线安装版下载
- WinXP系统浏览器字体大小怎么调--win7w.com
- 基于WS协议的webSocket通信
- 目前最火热的IT技术有哪些?
- 清华大学百年校庆给清华大学的一封信
- html表格 内容间距,html怎么设置表格间距
- emucheat,emucheat下载
- 关于ElasticSearch (ES)