手把手教你使用qsort函数

简介: 手把手教你使用qsort函数

一、qsort函数

1.qsort函数的用途

qsort的作用是对不同数据类型的数组的内容进行排序,排序的升序降序可以由你所提供的函数参数所改变。

2.qsort函数的参数

图片出自:cplusplus.com - The C++ Resources Network

从函数的参数部分我们可以看出,qsort一共有4个参数

第一个是无类型的指针拓展:可忽略(为什么是无类型的呢?因为qsort函数不知道传递过来的是什么类型的数组,它不知道我们要对什么样的数组排序,它得通过这种方式先将地址传递到函数中,再在函数中判断这一类型指针的权限,如此便可顺利地实现地址的查询,这才能按要求进行排序,毕竟不同类型的指针,所对应的权限不一样,比方说int*和char*类型的,这两个类型的指针加1一个跳过4个字节,另一个加1跳过1个字节)在使用qsort函数时要传递的是被排序数组的首地址


第二、三个是无符号整型(size_t)我们使用sizeof()函数得到的整数便是size_t类型的,它和整型相似。在使用qsort函数时可以传递整型数据,大于0即可,没有什么数组的元素个数和元素大小是小于等于0的吧?要传递的分别是数组的元素个数和数组一个元素的大小


第四个参数通俗点来说就是一个函数,这个函数的返回值是int型 在观察两个参数前我们先不看const,那么两个参数是无类型(原因与之前一致)指针,再加上const,将地址对应的数值常量化,使其不能被修改,这一步是为了提高代码的安全性,毕竟我们只是排序,是不会对数组中的内容进行修改的。在使用qsort时我们要传递过去的时一个能够对比两个指针对应数据大小的函数,第一个参数大于第二个参数,返回大于0的数,小于返回小于0的数,等于返回0,这样使用qsort便会升序排序,你也可以反过来,第一个参数大于第二个参数,返回小于0的数......如此便会降序排序

二、使用qsort函数

1.如何使用

我们先随便来一个数组

int arr1[10] = { 1,3,2,4,7,6,5,8,10,9 };

我们接下来的目标就是对它进行排序,先排成升序

接着求出元素个数,和一个元素对应的大小

1. int sz1_num = sizeof(arr1)/sizeof(arr1[0]);
2. int sz1=sizeof(arr1[0]);

接下来便是比大小函数

int cmp_int(void const*i1,void const*i2)
{
  return *((int*)i1) - (*(int*)i2);
}

一步步分析,首先是函数返回值类型和参数,这两个得和qsort所定义的一致   再然后,根据自己要排序的数组类型,将数据强制类型转换为对应类型的数据   这里我们要排序的类型是int型的数组,我们先强转即(int*)i1,接着对强转后的数据解引用,如此就可以使用该地址对应的整型类型的数据   i2同理取出,用做差的方式比大小,不难看出,第一个数据对应的值大于第二个数据对应的值返回大于0的数,小于,返回小于0的数,等于返回0,跟我们之前的要求一致。


如此便可使用qsort函数了,所有的要素都集齐了。为了能够看出排序的效果,这里笔者写了一个专门打印整型类型数组的函数

void print_int(int*i1, int sz)
{
  int i = 0;
  for (;i<sz;i++)
  {
    printf("%d ", *(i1 + i));
  }
  printf("\n");
}

2.代码实现

int cmp_int(void const*i1,void const*i2)//比大小
{
  return *((int*)i1) - (*(int*)i2);
}
void print_int(int*i1, int sz)//打印
{
  int i = 0;
  for (;i<sz;i++)
  {
    printf("%d ", *(i1 + i));
  }
  printf("\n");
}
int main()
{
  int arr1[10] = { 1,3,2,4,7,6,5,8,10,9 };//被排序数组
  int sz1_number = sizeof(arr1)/sizeof(arr1[0]);//数组元素个数
  int sz1 = sizeof(arr1[0]);//数组单个元素大小
  print_int(arr1, sz1_number);//打印排序前
  qsort(arr1, sz1_number,sz1, cmp_int);//使用qsort进行排序
  print_int(arr1, sz1_number);//打印排序后
}

运行结果如下:

3.小结:

数组首元素地址,数组元素个数,数组单个元素大小,比大小函数,这四个要素凑齐便可进行快速排序,可能现在你觉得复杂,但慢慢的你就会熟练,这是一个很好用的函数,别放弃它。

4.拓展

用所学知识看懂如下代码,并尝试自己写下

#include<stdio.h>
struct monster//创建结构体类型
{
  char name;
  int power;
  int life;
}typedef mon;//将struct monster这个结构体类型定义一个新名字
int cmp_mon_life(void const* m1, void const* m2)//比大小
{
  return  ((mon*)m2)->life - ((mon*)m1)->life;
}
void print_cmp_life(mon* i1, int sz)//打印
{
  int i = 0;
  for (; i < sz; i++)
  {
    printf("%d ", (i1 + i)->life);
  }
  printf("\n");
}
int main()
{
  mon arr2[3] = { {"goblin",10,100} ,{"wolf",15,80} ,{"human",12,150} };
  int sz2_number = sizeof(arr2) / sizeof(arr2[0]);//数组元素个数
  int sz2 = sizeof(arr2[0]);//数组单个元素大小
  print_cmp_life(arr2, sz2_number);//打印排序前
  qsort(arr2, sz2_number,sz2, cmp_mon_life);//排序
  print_cmp_life(arr2, sz2_number);//打印排序后
}

今天的分享到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O

相关文章
|
机器人
在钉钉中,自动化小助手是一种机器人
在钉钉中,自动化小助手是一种机器人【1月更文挑战第20天】【1月更文挑战第100篇】
973 3
|
安全 Linux Anolis
CentOS to 龙蜥衍生版 KeyarchOS 系统迁移体验 | 开发者说
CSDN 知名博主使用龙蜥衍生版 KeyarchOS 迁移使用体验,欢迎阅读。
|
开发者
关于华为手机无线调试
把开发者选项中的都选上,然后注意电脑和手机连同一个区域网就可以
1305 0
关于华为手机无线调试
|
消息中间件 缓存 运维
云HIS管理系统源码,SaaS模式
1、融合B/S版电子病历系统,支持电子病历四级,HIS与电子病历系统均拥有自主知识产权。 2、全套系统采用云部署模式,部署一套可支持多家医院共同使用。 3、适用于二级医院、基层医疗机构,可作为区域HIS使用,经扩展后能够应用于医联体/医共体。 4、具有独立的配套SaaS模式运维管理系统,支持远程运维,运维功能丰富、方便易用。
600 1
云HIS管理系统源码,SaaS模式
|
9天前
|
人工智能 安全 Linux
【OpenClaw保姆级图文教程】阿里云/本地部署集成模型Ollama/Qwen3.5/百炼 API 步骤流程及避坑指南
2026年,AI代理工具的部署逻辑已从“单一云端依赖”转向“云端+本地双轨模式”。OpenClaw(曾用名Clawdbot)作为开源AI代理框架,既支持对接阿里云百炼等云端免费API,也能通过Ollama部署本地大模型,完美解决两类核心需求:一是担心云端API泄露核心数据的隐私安全诉求;二是频繁调用导致token消耗过高的成本控制需求。
5380 11
|
17天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
21570 116

热门文章

最新文章