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函数详解及使用例相关推荐

  1. C语言-qsort函数详解

    目录 一.qsort函数是什么 二.使用qsort排序-以升序为例 关于void*型指针: 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒 ...

  2. C语言 qsort()函数详解 (笔记)

    qsort函数,其声明在stdlib.h文件中,时间复杂度为n*log(n). 功能:使用快速排序例程进行排序 用法: void qsort(void *base, size_t nitems, si ...

  3. C语言 - qsort函数详解

    文章目录 一.qsort函数简介 1.qsort函数是C标准库<stdlib.h>库中的函数,使用时引入#include <stdlib.h>.** 2.它的函数原型是 voi ...

  4. C语言qsort函数详解

    目录 一.qsort函数的使用 二.qsort函数的模拟 一.qsort函数的使用 快排函数qsort是C的库函数,它可以对输入的任何类型的数组排序,通过该函数的函数声明我们可以看出它的使用方法: 举 ...

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

    [排序]什么都能排的C语言qsort排序详解[超详细的宝藏级别教程]深度理解qsort排序 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客之前,博主在这里 ...

  6. 冒泡排序和qsort函数详解以及如何模拟实现qsort函数

    一.冒泡排序 冒泡排序是一种常见的排序方式,它可以把数组元素有序或无序的数组进行重新排序,并使得数组中的元素从大到小或从小到大进行排序(就像泡泡一样). 冒泡排序原理: 每次比较数组中的相邻的两个元素 ...

  7. qsort函数详解以及模拟实现

    qsort函数详解以及模拟实现 一.qsort函数是什么 二.具体的使用 1.参数4(参数3在模拟实现时解释) 2.例子 1.排序整形 2.排序结构体 三.模拟实现qsort 1.参数3 2.模拟排序 ...

  8. c语言memset对应java,C语言memset函数详解

    C语言memset函数详解 memset() 的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零. 它是直接操作内存空间,mem即"内存"(memory)的意思. ...

  9. R语言which函数详解以及Rcpp改写

    R语言which函数详解以及Rcpp的改写 引言 which 函数的介绍 which函数的一些小例子 1 2 which函数的改进以及时间对比 引言 首先来介绍一下R语言which函数的作用:whic ...

最新文章

  1. IEEE 发布年终总结,AI 奇迹不再是故事
  2. 【转载】FckEditor 2.6.3 for Java 2.4 配置
  3. 优化JMeter自身性能
  4. mysql怎么显示结果窗口_mysql8中窗口函数
  5. C# 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集...
  6. 学习java 第三天 数据类型以及存储大小取值范围 (one 大白 (●—●))
  7. 编程实现strcpy函数_C编程中的strcpy()
  8. 基于WPF系统框架设计(7)-TextBox/PasswordBox在ViewModel中支持回车命令
  9. 三句话教你买对房子!买到好房子的都祝福哥三年内赚两个亿!
  10. 封装kmalloc/malloc的一些小函数
  11. 锐捷客户端显示无法连接认证服务器,锐捷客户端连接失败怎么办 锐捷连不上解决办法...
  12. 分享工作上的一些体会
  13. 只要花3K 手把手教你制作炫酷的MR混合现实视频
  14. oracle如何异地备份软件,数据库Oracle数据的异地的自动备份
  15. 高数 | 为什么f(x)从a到b的积分等于从b到a的积分的相反数?
  16. 工业机器人与计算机控制,不懂工业机器人控制技术?那你一定是没看过这篇文章...
  17. 打造属于自己的TensorFlow(一)之SimpleFlow-计算图与前向传播
  18. 被吹爆的性能强者FastAPI,实际性能不到Flask一半
  19. .py与.pyc文件的区别
  20. Oracle数据库学习(一):Oracle 11g数据库下载及安装

热门文章

  1. FPGA:什么是IO单元、IO标准、Bank、VCCO、VREF
  2. 【EE308FZ Lab2-1】Android App for Bobing (Prototype)
  3. [转]Windows CE 6.0(PB6)离线安装版下载
  4. WinXP系统浏览器字体大小怎么调--win7w.com
  5. 基于WS协议的webSocket通信
  6. 目前最火热的IT技术有哪些?
  7. 清华大学百年校庆给清华大学的一封信
  8. html表格 内容间距,html怎么设置表格间距
  9. emucheat,emucheat下载
  10. 关于ElasticSearch (ES)