一.qsort()函数的用法及使用说明:

目录

一.qsort()函数的用法及使用说明:

二.使用qsort()函数来求关于各种类型的(降序)排序

1.int类型的数组进行排序

2.char类型的数组进行排序

3.double类型的数组排序(与前两个有区别)

4.结构体进行排序(按照需要用什么进行排序,具体情况具体分析)

三.总结


void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );是在C语言中的排序函数其中的参数如下:

第一个参数表示需要排序的是哪个数组,第二个参数是排序的个数,第三个参数是每个排序的数的字节大小,注意:最后一个参数是进行排序的规则,这个规则需要自己去实现,实际上是一个比较大小的函数,对于不同的数据类型需要将参数值转化为不同的参数,一般常用的写法如下:

int compare(const void* a,const void* b){return *(type*)a-*(type*)b;//升序//return *(type*)a-*(type*)b;//降序}

其中type*是将a强转为对应的指针类型,然后再进行解引用得到a的值,同理b也如此。对于该种排序为升序排序,注释后的为降序排序

二.使用qsort()函数来求关于各种类型的(降序)排序

1.int类型的数组进行排序

compare函数返回值有三种结果大于0,等于0,小于0.

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//比较函数
int compare(const void* a, const void* b){return  (*(int*)a) - (*(int*)b);//升序排序
}//打印数组
void print(int* arr,int len){for (int i = 0; i < len; i++){printf("%d ",arr[i]);}printf("\n");
}
int main(){int arr[] = {12,10,11,8,3,9,0};int len = sizeof(arr) / sizeof(arr[0]);//数组长度qsort(arr,len,sizeof(int),compare);print(arr,len);return 0;
}

2.char类型的数组进行排序

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int compare(const void* a, const void* b){return  (*(char*)a) - (*(char*)b);//降序排序
}
//打印数组
void print(char* arr, int len){for (int i = 0; i < len; i++){printf("%c ", arr[i]);}printf("\n");
}
int main(){char arr[] = {'d','a','r','x','g','e','x','g','a','w'};int len = sizeof(arr) / sizeof(arr[0]);//数组长度qsort(arr,len,sizeof(char),compare);print(arr, len);return 0;
}

3.double类型的数组排序(与前两个有区别)

因为doble是浮点类型,是小数,所以只有大于0和小于0两种结果

//double类型排序
int compare(const void* a, const void* b){return  (*(double*)a) > (*(double*)b);//升序排序
}
//打印数组
void print(double* arr, int len){for (int i = 0; i < len; i++){printf("%lf ", arr[i]);}printf("\n");
}
int main(){double arr[] = {1.2,5.42,0.3,3.6,5.8};int len = sizeof(arr) / sizeof(arr[0]);//数组长度qsort(arr,len,sizeof(double),compare);print(arr, len);return 0;
}

4.结构体进行排序(按照需要用什么进行排序,具体情况具体分析)

例如:按照学生的编号进行排序,开始存在数组中的编号为2,1,3.排序后的编号为1,2,3

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Student{char name[10];int num;
}student;
//结构体类型排序
int compare(const void* a, const void* b){return   ((student*)a)->num - ((student*)b)->num;//升序排序
}
//打印数组
void print(student* arr, int len){for (int i = 0; i < len; i++){printf("%s=%d ", arr+i,arr[i].num);printf("\n");}}
int main(){student arr[3];strcpy(&arr[0], "Mary");//这里使用字符串拷贝是因为只能访问到姓名地址,无法直接更改arr[0].num = 2;strcpy(&arr[1], "John");arr[1].num = 1;strcpy(&arr[2], "Ming");arr[2].num = 3;int len = sizeof(arr) / sizeof(arr[0]);//数组长度qsort(arr,len,sizeof(student),compare);print(arr, len);return 0;
}

三.总结

在double类型需要注意返回值,在结果体中需要注意需要比较的规则。总之,qsort()函数主要是关于参数中的最后一个比较函数的书写,只要注意到,基本上应该没有问题。

C语言的排序函数qsort()详解相关推荐

  1. c语言 freopen txt_C语言文件操作函数freopen详解

    C语言文件操作函数freopen详解 今天做USACO 用到了文件的操作. 之前做USACO只是格式化的.些 写 freopen("xxx.in","r",st ...

  2. Python之排序函数sorted()详解

    文章目录 描述 语法 返回值 实例 一般用法: 高级用法: 1.lambda函数 2.operator.itemgetter() 3.机器学习实例 参考 描述 sorted() 函数对所有可迭代的对象 ...

  3. 【C语言进阶】⑥函数指针详解

    一.函数指针 1.概念 函数指针:首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址: 请看示例: int main(){int a = 10; int*pa = &a; c ...

  4. qsort函数用法详解

    qsort()函数用法详解 limabean 本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利. 1.qsort函数简介 排序是程序员经常碰到的问题, ...

  5. C语言排序函数——qsort

    C语言排序函数--qsort: qsort函数原型: void __cdecl qsort(void *_Base,size_t _NumOfElements,size_t _SizeOfElemen ...

  6. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  7. R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表

    R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据

  8. R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表

    R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表

  9. R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

    R语言tidyr包Unite()函数实战详解:多个数据列合并为一列 目录 R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

最新文章

  1. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(三)使用多边形将轮廓包围
  2. Linux多任务编程之五:exit()和_exit()函数(转)
  3. HTML5 服务器发送事件(Server-Sent Events)介绍
  4. Python的numpy库中rand(),randn(),randint(),random_integers()的使用
  5. Matlab | 空间域水印技术:LSB(Least Significant Bit):计算峰值信噪比PSNR(matlab源代码)
  6. java.util.concurrent包
  7. linux include 编译,linux-如何使用OpenSSL include编译.c文件?
  8. Epic Games资深程序工程师王祢: 使用UE4制作VR内容的优化
  9. 基于JAVA+SpringBoot+Mybatis+MYSQL的美食分享网站
  10. 程序、线程、进程的区别(python、Java举例)
  11. 去除input框的值
  12. Springboot2.X + screw数据库快速开发文档
  13. 字体加密woff(@font-face)防爬-学习记录
  14. 音频变压器阻抗匹配及案例
  15. [词根词缀]eco/ego/electr的由来及词源知识E
  16. 7-22 LC老玩游戏 (30 分)
  17. 航姿参考系统(AHRS)
  18. 苹果手机计算机隐藏照片app,‎App Store 上的“秘密计算器 - 隐藏私人照片和视频”...
  19. [QT学习]-调色板|选择文件
  20. 设计模式-UML图(细化)

热门文章

  1. MP3是如何诞生的?
  2. 纯量产经验 | 谈谈目标检测中正负样本的问题
  3. cocos creator打包安卓完整流程
  4. 学习周报20200808 | 谷歌、领英都在用的OKR工作高绩效秘籍
  5. pngquant批量压缩Windows脚本
  6. Linux系统下载echarts,echarts图形展示
  7. 右脑开发/开天眼/打通大周天/近视眼康复
  8. 操作系统 — 生产者消费者模型
  9. JAVA延迟队列(实现数据的缓存和定时清理)
  10. event loop 事件轮询机制