C语言qsort函数使用方法大全

文章目录

    • 一、qsort函数简介
    • 二、qsort函数常用实例
      • 1.比较整型数组
      • 2.比较char数组
      • 3.比较double数组
      • 4.比较字符串
        • 4.1按首字母排序
        • 4.2按长度排序
        • 4,3按字典顺序
      • 5.结构体排序
        • 5.1 多级排序
    • 三、qsort深度剖析

一、qsort函数简介

排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序是目前公认的一种比较好的排序算法。因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort函数(全称quicksort)。它是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)

功能: 使用快速排序例程进行排序
头文件:stdlib.h
用法: void qsort(void* base,size_t num,size_t width,int(__cdeclcompare)(const void,const void*));
参数: 1 待排序数组,排序之后的结果仍放在这个数组中
    2 数组中待排序元素数量
    3 各元素的占用空间大小(单位为字节)
   4 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数)

二、qsort函数常用实例

1.比较整型数组

#include <stdlib.h>
#include <stdio.h>int cmp_int(const void* _a, const void* _b)
{int* a = (int*)_a;    //强制类型转换int* b = (int*)_b;return *a - *b;
}int main() {int arr[] = {1, 3, 6, 2};printf("排序前:"); for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){printf("%d  ",arr[i]);}qsort(arr,sizeof(arr)/sizeof(arr[0]) ,sizeof(arr[0]), cmp_int); printf("\n排序后:");for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){printf("%d  ",arr[i]);}
} 

image-20210818211839401

2.比较char数组

#include <stdlib.h>
#include <stdio.h>int cmp_char(const void *a,const void *b)
{return *(char *)a - *(char *)b;
}int main() {char arr[] = {'b', 'd', 'a', 'c'};printf("排序前:"); for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){printf("%c  ", arr[i]);}qsort(arr,sizeof(arr)/sizeof(arr[0]), sizeof(arr[0]), cmp_char); printf("\n排序后:");for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){//printf("");printf("%c  ", arr[i]);}
} 

3.比较double数组

#include <stdlib.h>
#include <stdio.h>int cmp_double(const void *a, const void *b)
{return *(double *)a > *(double *)b? 1 : -1;} int main() {double arr[] = {1.0, 3.0, 6.0, 2.0};printf("排序前:"); for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){printf("%.2lf  ",arr[i]);}qsort(arr,sizeof(arr)/sizeof(arr[0]) ,sizeof(arr[0]), cmp_double); printf("\n排序后:");for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){printf("%.2lf  ",arr[i]);}
} 

4.比较字符串

4.1按首字母排序

#include<stdio.h>
#include<stdlib.h>
#define L 10
#define K 10
int inc(const void *a, const void *b)
{return *(char *)a - *(char *)b;} 
int main ()
{char a[L][K] = {"rbsc","jcse","efgd","arbs","bbs","cbfe","dgafg" ,"ewqrta","ofgd","mbcv",};qsort(a, L, sizeof(char) * K, inc);for (int i = 0; i < L; i++){printf("%s\n", a[i]);}} 

下面是我还在尝试的一种方法,先记录一下

#include <stdlib.h>
#include <stdio.h>int cmp_string(const void *a, const void *b)
{return (char *)a - (char *)b;
} int main() {char* arr[] = {"rbas", "wlyy", "doii", "xkyy"};printf("排序前:"); for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){printf("%s  ",arr[i]);}qsort(arr,4 ,5 , cmp_string); printf("\n排序后:");for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){printf("%s  ",arr[i]);}
} 
---------------------------------------------------------#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>int cmp_string(const void* a, const void* b)
{assert(a != NULL && b != NULL);const char** lhs = (const char**)a;const char** rhs = (const char**)b;return strcmp(*lhs, *rhs);
}int main() {char* arr[] = {"rbas", "wlyy", "doii", "xkyy"};printf("排序前:"); for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){printf("%s  ",arr[i]);}qsort(arr,0 ,sizeof(arr)/sizeof(arr[0]) - 1, cmp_string); printf("\n排序后:");for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){printf("%s  ",arr[i]);}
}     

4.2按长度排序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
#define K 10
int inc(const void *a, const void *b)
{return strlen((char *)a) > strlen((char *)b) ? 1 : -1;} 
int main ()
{char a[L][K] = {"rbsc","jcsse","efgdsd","arbs","bbs","cbfefaa","dgafg" ,"ewqrta","ofgd","mbcv312",};qsort(a, L, sizeof(char) * K, inc);for (int i = 0; i < L; i++){printf("%s\n", a[i]);}} 

4,3按字典顺序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
#define K 10
int inc(const void *a, const void *b)
{return strcmp((char * )a, (char *)b);} 
int main ()
{char a[L][K] = {"rbsc","jcsse","afgdsd","arbs","abs","cbfefaa","cgafg" ,"ewqrta","ofgd","mbcv312",};qsort(a, L, sizeof(char) * K, inc);for (int i = 0; i < L; i++){printf("%s\n", a[i]);}} 

5.结构体排序

5.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;
}

三、qsort深度剖析

qsort函数原型如下:

void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 

qsort函数实现对不同元素的排序主要就是通过对compare函数进行定义实现的,对于每一种变量类型的排序,我们都需要重新实现一种compare函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/254081.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C语言-qsort函数详解

目录 一.qsort函数是什么 二.使用qsort排序-以升序为例 关于void*型指针&#xff1a; 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒泡排序思想模拟实现qsort函数 1.什么是冒泡排序&#xff1a; 2.冒泡排序代码 3. …

C语言qsort()函数的使用(详解)

目录 1.参数含义 1.首元素地址base 2.元素个数num 3.元素大小size 4.自定义比较函数compar 2.使用方式 1.头文件 2.compar的实现 3.整体代码 qsort&#xff08;&#xff09;函数&#xff08;quick sort&#xff09;是八大排序算法中的快速排序&#xff0c;能够排序任意…

虚幻4地形怎么增加层_虚幻周报20200407 | 在家也要好好工作呀~

官方知乎号&#xff1a;虚幻引擎 搜集日期&#xff1a;20200330-20200405 整理编辑&#xff1a; 大钊&#xff0c;小辉辉&#xff0c;马古斯&#xff0c;小帅帅 声明&#xff1a;文档搜集来自网上&#xff0c;难免遗漏&#xff0c;请联系我们投稿和添加关注。该文档版权归整理…

2020年笔记本电脑选购指南

**本文首发微信公众号陈蛋蛋碎碎念&#xff0c;获取更多软件、教程、模板资源&#xff0c;请关注公众号。 最近在群里有小伙伴问关于选购电脑的事&#xff0c;毕竟开学季又要到了。刚好蛋蛋现在又在3C公司工作&#xff0c;所以平时也需要了解这方面的知识&#xff0c;于是就准…

[转]Warzone 2100(战争地带2100)

发行公司&#xff1a;Eidos Interactive 开发公司&#xff1a;Pumpkin Studios 游戏类型&#xff1a;即时战略 游戏语言&#xff1a;英文 发行日期&#xff1a;1999 年4月 系统操作&#xff1a;Win95以上 伴随着这部来自英国开发公司Pumpkin Studios的作品&#xff0c;1999年…

显卡优化软件测试面试,是吹嘘还是真有用?NV游戏优化软件测试

1前言&#xff1a;NVIDIA游戏优化软件试用 英伟达真实热衷为用户提供出色的游戏方案&#xff0c;日前发布了一款GeForce Experience的新软件&#xff0c;本质上是一个基于云端的服务&#xff0c;旨在分析你的硬件并自动调整显示分辨率和游戏设置&#xff0c;以提供更好更优化的…

【转】为什么中国不会有3A游戏

编&#xff1a;王妙一&#xff0c;游戏开发者&#xff0c;代表作《WILL&#xff1a;美好世界》&#xff0c;曾获第二届PlayStation开发者大赛冠军。王妙一大学时就读于清华软件学院图形研究所&#xff0c;本文将从游戏图形技术的发展变迁开始&#xff0c;谈谈3A游戏在现今&…

FPS游戏

FPS 求助编辑百科名片 FPS FPS是第一人称射击类游戏的简称&#xff08;游戏专有名词&#xff09;。 FPS&#xff08;First-Person Shooter Game&#xff09;&#xff1a;第一人称射击游戏 严格来说FPS属于ACT类游戏的一个分支&#xff0c;但和RTS类游戏一样&#xff0c;由于其在…

Centos6.5环境Nginx 1.16.1升级到1.24.0版本

一、背景 2023年4月11日&#xff0c;官方发布了Nginx最新稳定版&#xff0c;版本号为 1.24.0。该版本是基于1.23.x&#xff08;1.23.0 - 1.23.4&#xff09;开发版的Bug修复&#xff0c;以及一些新特性的加入&#xff0c;而形成的稳定版。安全部门扫描后&#xff0c;发现现场不…

C++11 -- 包装器

文章目录 function包装器function包装器的概念function的运用function实例化使用function解决逆波兰表达式 bind包装器bind包装器相关介绍bind绑定函数固定参数 function包装器 function包装器的概念 function包装器,也叫做适配器,它的本质是一个类模板. 例如: 1 template&l…

chatgpt赋能python:Python中撤销的快捷键

Python中撤销的快捷键 在编程中&#xff0c;我们经常需要进行调试&#xff0c;不可避免地会出现一些错误&#xff0c;这时候撤销 (Undo) 功能就显得尤为重要。在 Python 中&#xff0c;我们可以使用一些快捷键来快速撤销&#xff0c;本文将会介绍这些快捷键的使用以及使用它们…

chatgpt赋能python:Python中的构造函数

Python 中的构造函数 Python 是一门广泛应用于各种应用领域的高级编程语言&#xff0c;它支持不同的编程范式&#xff0c;包括面向对象编程。在面向对象编程中&#xff0c;构造函数是一个重要的概念。本文将介绍 Python 中的构造函数&#xff0c;并介绍如何使用它们来创建对象…

淘宝店铺老店标识怎么显示 怎么淘宝老店标识申请

我们在很多时候都喜欢去一个淘宝开的时间比较长的店铺去购买商品&#xff0c;因为这样的店铺可能在信誉度这一块会更加能够让人信服&#xff0c;因为一个店铺能开这么久&#xff0c;肯定还是证明这个店铺拥有一定的实力。淘宝店铺老店标识怎么显示 怎么淘宝老店标识申请 在回答…

22-0001 淘宝店铺搜索界面

淘宝店铺搜索界面 1.元素2.过程2.1 搜索界面的网页源码2.2 通过Chrome控制台获取sellerid2.3 搜索链接2.4 控制台 3.总结 1.元素 获取店铺搜索界面每个店铺的’sellerid’ 备注&#xff1a;通过sellerid可以在下面链接中获取买家秀的图片&#xff0c;也可以使用相关软件进行下…

淘宝开店指南——店铺设置篇

目录 店铺基本设置店铺装修手机店铺装修PC 店铺装修 保证金管理客服&#xff08;子账号&#xff09;管理创建子账号修改子账号权限 店铺基本设置 通过千牛主账号工作台左侧点击【店铺】->选择【店铺信息进入】。 设置链接&#xff1a;点击访问 可设置内容&#xff1a; 个…

淘宝/天猫API:seller_info-获得淘宝店铺详情

万邦淘宝/天猫获得淘宝店铺详情 API 返回值说明 seller_info-获得淘宝店铺详情 onebound.taobao.seller_info 公共参数 请求地址: https://console.open.onebound.cn/console/?ipony 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;…

SpringCloud Alibaba Seata 工作机制

SpringCloud Alibaba Seata Seata 工作机制 说明 之所以放在后面说工作机制是因为如果一开始就说的话理解困难 所以我们有了前面的列子和说明我们在结合本节内容会收获的多理解相对容易点 分布式事务过程分析 Seata 分布式事务处理过程-ID三组件模型 debug 梳理: 术语 先…

ShardingSphere笔记(三):自定义分片算法 — 按月分表·真·自动建表

ShardingSphere笔记&#xff08;二&#xff09;&#xff1a;自定义分片算法 — 按月分表真自动建表 文章目录 ShardingSphere笔记&#xff08;二&#xff09;&#xff1a;自定义分片算法 — 按月分表真自动建表一、 前言二、 Springboot 的动态数据库三、 实现我们自己的动态数…

如何创建springboot项目

SpringBoot 优点 可快速构建spring应用直接嵌入tomcat、jetty、undenrtow服务器&#xff08;无须部署war文件&#xff09;提供依赖启动器&#xff08;starter&#xff09;简化构建配置极大程度的自动化配置Spring和第三方库提供生产就绪功能&#xff0c;例如指标监控检测、外部…

函数(C语言程序设计)

目录 一、函数定义 二、函数调用 三、递归函数 四、局部变量和全局变量 一、函数定义 1、无参函数的定义 类型名 函数名&#xff08;&#xff09; /*函数首部*/ { 函数体 } 或 类型名 函数名&#xff08;void&#xff09; /*函数首部*/ { 函数体 } void类型的函数不…