c语言qsort函数(快速排序)

在学习c语言时我们常常会遇到一些排序的问题,在遇到这些排序的问题的时候,我们当然可以自己选择写出自己的排序方法来进行排序。但是我们今天要介绍的是c语言库函数中所提供的一个快排函数。这个函数可以直接提供给我们快排这样一个工具,在面对一些情况的时候会起到事半功倍的效果。此外,它能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型,合理使用时非常方便。

一.qsort函数的参数

下图为cplusplus.com的标准库函数说明

其函数声明如下

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

1.首元素地址base

我们要排序一组数据,首先我们需要找到这组数据在哪,因此我们直接将首元素的地址传给qsort函数的指针void*来确定从这个数组的哪个地方开始排序。

2.元素的个数num

我们将需要排序的元素的个数传给qsort函数来确定一组数据。这是因为我们知道了从哪开始,也要知道在哪结束才能确定一组需要排序的数据,但是我们不方便直接将结尾元素的地址传入函数。

3.元素大小size

我们需要将元素大小传入qsort函数。qsort函数能排序任意数据类型的一组数据,因此我们用void*类型的指针来接收元素,但是我们知道void*类型的指针不能进行加减操作,也就是说无法移动。那么在函数内部我们究竟用什么类型的指针来操作变量呢?其实在函数内部,我们可以将void*类型的指针强制类型转换成char*类型的指针后来逐个字节地来操作元素,因为char*类型的指针移动的单位字节长度是1个字节,我们只需要知道需要操作的数据是几个字节就可以实现指针从一个元素恰好能够移动到下一个元素。

4.用户自定义的比较函数compar

我们需要告诉qsort函数我们希望数据按照怎么的方式进行比较。同需要传递元素个数的道理一样,qsort函数能排序任意数据类型的一组数据,因此库函数用void*类型的指针来指定我们我们编写的比较方式,可以起到不把函数写死,根据实际情况的需要写的作用。同时我们可以看到编写的函数的返回值大于零时,qsort函数会将数组里面前一个元素放在后一个元素后面,也就是两个元素进行调换。

二.比较函数的书写

qsort函数给cmpar函数规定了特定的参数const void* 。因此我们自定义函数时要严格遵守其参数设定。

如果你需要比较的是整形数组,你需要将比较函数中void*强制转换成int *,同时如果你希望qsort

进行升序快排,我们需要使得前一个数字比后一个数字大的时候返回1.

int compar(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}

同理如果需要进行降序快排的话

int compar(const void* e1, const void* e2)
{return *(int*)e2 - *(int*)e1;
}

比较的是字符串的大小,并进行升序快排的话:

int compare_str(const void* e1, const void* e2)
{return strcmp((char*)e1, (char*)e2);
}

比较的是字符串的长度,并进行升序快排的话:

int cmp_str_len(const void* e1, const void* e2)
{return strlen((char*)e1)-strlen((char*)e2);
}

比较结构体时需要指明需要比较的具体变量,就像我们不能比较一个人,除非有相应的标准:

int cmp_struct_stu_name(const void* e1, const void* e2)
{return strcmp(   ((struct stu*)e1)->name, ((struct stu*)e2)->name );
}
int cmp_struct_stu_GPA(const void* e1, const void* e2)
{return (  ((struct stu*)e2)->GPA - ((struct stu*)e1)->GPA  );
}

三.实例演示

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
struct stu
{char name[20];float GPA;
};
int compare_str(const void* e1, const void* e2)
{return strcmp((char*)e1, (char*)e2);
}
int cmp_str_len(const void* e1, const void* e2)
{return strlen((char*)e1) - strlen((char*)e2);
}
int cmp_struct_stu_name(const void* e1, const void* e2)
{return strcmp(   ((struct stu*)e1)->name, ((struct stu*)e2)->name   );
}
int cmp_struct_stu_GPA(const void* e1, const void* e2)
{return (  ((struct stu*)e2)->GPA - ((struct stu*)e1)->GPA  );
}
int main()
{int i = 0;struct stu s[3] = { {"zhangsan",3.4} ,{"zhangmazi",4.0} ,{"dingzhen",1.0} };qsort(s, 3, sizeof(s[0]), cmp_struct_stu_name);for (i = 0; i < 3; i++){printf("%s  %f\n", s[i].name, s[i].GPA);}qsort(s, 3, sizeof(s[0]), cmp_struct_stu_GPA);for (i = 0; i < 3; i++){printf("%s  %f\n", s[i].name, s[i].GPA);}}

可以看到只需要我们按要求写好参数qsort函数就能够帮我们对元素进行排序。

四.函数所需要的头文件

包含在stdlib.h头文件中,函数一共有四个参数,没有返回值。

c语言qsort函数(快速排序)相关推荐

  1. C语言qsort函数的实现

    C语言qsort函数的实现 1.首先阅读文档,查询qsort()函数的使用方法 2.开始实现自己创建的qsort()函数 1.首先阅读文档,查询qsort()函数的使用方法 void qsort (v ...

  2. C语言qsort()函数

    C语言qsort()函数 #include<stdio.h> #include<stdlib.h> int cmp (const void * a, const void * ...

  3. C语言-qsort函数详解及使用例

    q s o r t ( ) qsort() qsort() 函数是C语言 srdlib.h 库中的排序函数.此函数使用快速排序算法,时间复杂度一般在 O ( l g ( n ) ) O(lg(n)) ...

  4. c语言qsort函数简介,C语言排序函数—qsort函数

    前言: 在一些编程题中经常需要你按照某个指标按照从小到大或从大到小输出一些数据,这时你可以自己写一个排序函数进行排序,但是其实C语言函数库中就有一个排序函数--qsort函数,使用它可以节省你单独写排 ...

  5. C语言qsort函数的使用详解

    文章目录 一.qsort函数简介 1.函数原型 2.参数含义 3.比较函数详解 二.比较函数使用案例 1.整型数组 2.字符数组 3.double型数组 4.字符串 1.按字符串首字母进行排序 2.按 ...

  6. c语言qsort函数的用法与模拟实现

    一.qsort函数说明 首先他是一个库函数,在使用时需要包含stdlib.h这个头文件,其次他是一个基于快速排序算法的排序函数,任何类型的数据都可以实现排序,比如字符串排序,结构体排序及整形排序. 二 ...

  7. C语言qsort函数对二维数组排序的不同情况

    内置排序函数--qsort函数 函数说明: 下面博主讲的很清楚,不多介绍. C语言:qsort()解析 对二维数组: 上文博主提到了对二维数组排序时compare函数的写法,但在具体实践中,我们会发现 ...

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

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

  9. C语言-qsort函数详解

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

最新文章

  1. AndroidStudio动态调试smali
  2. oracle10g-创建表空间 用户
  3. java WebSocket的实现以及Spring WebSocket
  4. jquery.form.js实现将form提交转为ajax方式提交的使用方法
  5. openwrt下ipk生成过程及原理
  6. Python实现人脸识别
  7. Coverity代码扫描工具
  8. 无线射频专题《IEEE 802.11协议讲解1@路由高级配置项,Beacon周期、RTS阈值、DTIM》
  9. azkaban 项目依赖
  10. 瑞星客户端卸载操作手册
  11. MATLAB | solve函数求解析解时不支持分段函数的解决方案
  12. Flowchart流程图示例
  13. ionic3 css判断设备,第十三讲 ionic css布局介绍
  14. iphone修改密码时服务器,iPhone 突然弹出窗口要求修改密码怎么办?
  15. c语言记录键盘敲击次数,【转】你知道一天敲键盘的敲击次数能达到多少么
  16. 维谛技术(Vertiv):场景驱动的边缘计算
  17. 从网上订火车票的网站12306.cn谈谈网站性能技术
  18. 分子动力学模拟再登顶刊(IF=18.72)
  19. linux 系统安装 QQ 2019【QQ for linux】
  20. 小米Pro 15.6 系统重装记录

热门文章

  1. ADC0804的使用
  2. NTT DATA创建东盟地区历史文化遗产的数字档案并向公众开放
  3. PDF文档如何进行加密
  4. vue小实验——小米商城购物车,合计、结算、数量加减
  5. 计算机毕业设计ssm基于vuejs的二手车交易平台ue120系统+程序+源码+lw+远程部署
  6. 我的左眼是超级计算机,神迹!雷神左眼失明,左臂被斩,这位“神医”却瞬间治好...
  7. Java基础之JDK8之Stream接口
  8. centos7系统安装锐速方法
  9. Django项目开发——002架构梳理
  10. GNSS速度场简易MATLAB克里金插值