目录

  • 函数简介
    • 一、数组排序(整型、double、字符串)
      • 1.参考代码:
      • 2.测试:
    • 二、结构体排序(多级排序)
      • 1.参考代码:
      • 2.测试:

函数简介

简介来源于百度百科

头文件: <stdlib.h>;

函数声明:
void qsort( void * base , size_t nitems , size_t size , int ( * compar) (const void * , const void * ))

参数:

  • base-- 指向要排序的数组的第一个元素的指针。
  • nitems-- 由 base 指向的数组中元素的个数。
  • size-- 数组中每个元素的大小,以字节为单位。
  • compar-- 用来比较两个元素的函数,即函数指针(回调函数)

回调函数:

  • 回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递
    给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。

compar参数

  • compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。
  • int compar(const void *p1, const void *p2);
  • 如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的左面;
  • 如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
  • 如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的右面。

一、数组排序(整型、double、字符串)

1.参考代码:

#include<stdio.h>
#include<stdlib.h>
#define N 10int cmp1(const void *a, const void *b)//整型数组
{int *s1 = (int *)a;int *s2 = (int *)b;   return *s1 - *s2;
}int cmp2(const void *a, const void *b)//字符串数组
{double *s1 = (double *)a;double *s2 = (double *)b;return *s1 > *s2 ? 1:-1; //两个double类型相减会导致精度丢失,无法得出正确的正负值//所以只能通过比较大小来返回正确的正负值
}int cmp3(const void *a, const void *b)//整型数组
{char *s1 = (char *)a;char *s2 = (char *)b;return *s1 - *s2;
}int main()
{int num1[N] = {9,8,7,6,5,4,3,2,1,0};qsort(num1 , N , sizeof(int) , cmp1);double num2[N] = {1.9,1.8,1.7,1.6,1.5,1.4,1.3,1.2,1.1,1.0};qsort(num2 , N , sizeof(double) , cmp2);char str[N] = {'j','i','h','g','f','e','d','c','b','a'};qsort(str , N , sizeof(char) , cmp3);int i;printf("整型数组排序:\n");for(i = 0 ; i < N ; i++)printf("%d " , num1[i]);printf("\n");printf("double数组排序:\n");for(i = 0 ; i < N ; i++)printf("%1.2f " , num2[i]);printf("\n");printf("字符串数组排序:\n");for(i = 0 ; i < N ; i++)printf("%c " , str[i]);printf("\n");return 0;
}

2.测试:

二、结构体排序(多级排序)

1.参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student
{int id;char name[10];int grade;
}student;int cmp1(const void *a, const void *b)//一级排序
{student *s1 = (student*)a;student *s2 = (student*)b;return s1->id - s2->id;
}int cmp2(const void *a,const void *b)//二级排序
{student *s1 = (student*)a;student *s2 = (student*)b;if(strcmp(s1->name , s2->name) != 0)return strcmp(s1->name , s2->name); else    return s1->id - s2->id;
}int cmp3(const void *a,const void *b)//三级排序
{student *s1 = (student*)a;student *s2 = (student*)b;if(s1->grade != s2->grade)    return s1->grade - s2->grade;else{if(strcmp(s1->name , s2->name) != 0)return strcmp(s1->name , s2->name);elsereturn s1->id - s1->id;}
}int main()
{int i,N,C;scanf("%d %d",&N,&C);student *stu;stu=(student*)malloc(N*sizeof(student));for(i = 0 ; i < N ; i++)scanf("%d %s %d" , &stu[i].id , stu[i].name , &stu[i].grade);switch(C){case 1:  qsort(stu, N, sizeof(student), cmp1);break;//一级排序case 2:    qsort(stu, N, sizeof(student), cmp2);break;//二级排序case 3:    qsort(stu, N, sizeof(student), cmp3);break;//三级排序}printf("排序结果:\n");for(i = 0 ; i < N ; i++)printf("%03d %s %d\n" , stu[i].id , stu[i].name , stu[i].grade);return 0;
}

2.测试:

结构体体的三级排序测试:
第一级是对学生成绩整体从小到大排序;
第二级是对相同成绩的学生,按照姓名进行排序;
第三级是对相同成绩、姓名的学生,按照学号进行排序;

C语言qsort()函数用法总结相关推荐

  1. C语言qsort函数用法

    qsort函数简介 排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等. 看名字都知道快速排序是目前公认的一种比较好的排序算法.因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用. ...

  2. 【C语言】qsort函数用法(转)

    qsort函数用法 qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(cons ...

  3. C语言 qsort的用法 模拟EXCEL排序

    C语言 qsort的用法 模拟EXCEL排序 题目 Excel可以对一组记录按任意指定列排序.现请编写程序实现类似的功能. 输入 输入的第一行包含两个正整数N(<= 10^5)和C,其中N是记录 ...

  4. C语言atoi()函数用法

    C语言atoi()函数用法 头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为: int atoi (const char * s ...

  5. fclose在c语言中的作用,c语言fcloseall函数用法实例介绍

    c语言fcloseall函数用法实例介绍.fcloseall函数的返回值,函数 fcloseall() 将所有打开的流与其底层的文件或功能集合关闭.任何缓冲的数据都将首先被写入,使用 fflush(3 ...

  6. linux c语言 select函数用法

    原文地址:点击打开链接 linux c语言 select函数用法 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 co ...

  7. C语言qsort函数的实现

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

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

    c语言qsort函数(快速排序) 在学习c语言时我们常常会遇到一些排序的问题,在遇到这些排序的问题的时候,我们当然可以自己选择写出自己的排序方法来进行排序.但是我们今天要介绍的是c语言库函数中所提供的 ...

  9. c语言字符串strchr,C语言 strchr 函数用法

    C语言 strchr 函数用法 C语言中strchr函数作用是为在一个串中查找给定字符的第一个匹配之处,该函的原型为"char *strchr(const char *str, int c) ...

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

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

最新文章

  1. M1芯片成功运行Linux,终端一行代码启动安装,也能一键删除卸载
  2. python趣味编程10例-Python趣味编程100题
  3. AcWing 703. 数独检查
  4. 数据结构(终极线段树篇)
  5. selenium autoit java_selenium借助AutoIt识别上传文件Java篇
  6. 从maya中 导入物体 到Uniyt3D 规范 整理
  7. 关于 IoT 的发展
  8. CANOE使用八:自动化测试OSEK网络管理(创建TestModule-搭配Panel界面及使用Capl识别配置文件TXT的自动化测试流程)
  9. 2018年总结,踩踩这条即将溜掉的狗尾巴 ~
  10. 国产手机再次发力,是否可以阻击三星苹果
  11. 操作系统(六) 页面置换
  12. c语言 long与integer,VB中Integer(整型)和Long(长整型)有什么区别?
  13. 第十章 IP的分片与重装
  14. 华为云大数据-助力数据价值化,释放企业发展潜能
  15. Html颜色颜色选择器小技巧
  16. java计算机毕业设计服装连锁店后台管理系统(附源码、数据库)
  17. Springboot中手动new的对象无法注入交给Spring容器管理的原因及解决办法
  18. 鸣鸿刀模厂家告诉你怎么去选择合适的刀模
  19. android整合好视通sdk经验总结(二)
  20. 九连环游戏算法递归实现

热门文章

  1. python调用短信api接口实现验证码发送
  2. 西门子PLC S7-200数字量扩展模块
  3. php抽奖幸运,幸运大转盘-jQuery+PHP实现的抽奖程序
  4. python弹性碰撞次数圆周率_关于“用理想弹性碰撞能用来计算π”视频的小讨论...
  5. IDEA 提示Unmapped Spring configuration files found的解决办法
  6. 如何转换图片格式?建议收藏这两个方法
  7. .net 开发工程师 面试题
  8. 邮箱 手机号 格式要求
  9. CorelDRAW零基础入门到精通
  10. win10各个版本激活码到期了