qsort函数的应用

简介: qsort函数的应用

C语言中对数据进行排序,但数据类型有很多种,比如整形,字符型,浮点型,结构体型等等,


用冒泡排序只能对一种类型进行排序,很不方便,这就需要一个强大的函数了。


qsort可以对各种类型的数据进行排序,但要用合理的方法去用它


qsort的使用


void qsort (void* base, size_t num, size_t size,

           int (*compar)(const void*,const void*));



qsort需要四个参数,前三个很好理解,第四个参数用来比较两个元素,返回的整形。

qsort 的使用


代码示例:

//比较两个数的大小
int int_cmp(const void* p1, const void* p2)
{
  return *(int*)p1 - *(int*)p2;
}
//打印数组
void print(int* arr,int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", *(arr + i));
  }
  printf("\n"); 
 
}
 
#include<stdio.h>
int main()
{
  int arr[10] = { 2,4,1,4,8,6,5,9,7,5 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  int width = sizeof(int);
  printf("排序前:");
  print(arr, sz);
 
  qsort(arr, sz, width, int_cmp);
 
  printf("排序后:");
 
  print(arr,sz);
 
  return 0;
}


用冒泡排序模拟qsort 的实现




因为qsort可以排列不同类型的数据,所以int_comp函数里要用void*指针来接收




进行交换,注意要转化成char类型!

最后浅浅打印一下



完整代码:

#include<stdio.h>
 
int int_comp(const void* p1, const void* p2)
{
  return *((int*)p1) - *((int*)p2);
}
 
 
void swap(void* e1, void* e2, int width)
{
  int i = 0;
  for (i = 0; i < width; i ++ )
  {
    char tem = *((char*)e1 + i);
    *((char*)e1 + i) = *((char*)e2 + i);
    *((char*)e2 + i) =  tem;
 
  }
}
void _qsort(void* arr, int sz, int width, int(*comp)(void* p1, void* p2))
{
  int i = 0;
  for (i = 0; i < sz - 1; i++)
  {
    int j = 0;
    for (j = 0; j < sz - 1 - i; j++)
    {
      if (comp((char*)arr+j*width, (char*)arr + (j+1) * width) > 0)
      {
        swap((char*)arr + j * width, (char*)arr + (j + 1) * width, width);
      }
    }
  }
}
 
 
void print(int arr[],int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");
}
 
int main()
{
  //qsort的模拟
  //排列整型
  int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  int width = sizeof(int);
 
  print(arr, sz);
 
  _qsort(arr, sz, width, int_comp);
 
  print(arr, sz);
 
  return 0;
}


这个模拟qsort函数也是很强大的,这里只排序了整形,还可以排序字符型,结构体等等。

这是我对qsort函数的一些理解。

相关文章
|
JSON API 数据格式
5分钟构建API接口服务 | python小知识
Flask是python中轻量的web框架,Flask的两个核心模块除了模板渲染之外就是请求响应处理,其中请求响应处理是由 Werkzeug(WSGI 工具库)完成,而模板渲染是由Jinja(模板渲染库)完成。 Flask因为轻量灵活,用来构建API接口十分合适
11683 10
5分钟构建API接口服务 | python小知识
|
缓存 监控 小程序
App性能测试揭秘(Android篇)
性能测试在移动测试领域一直是一个大难题,它最直观的表现是用户在前台使用 App 时的主观体验,然而决定体验优劣的背后,涉及到了许许多多的技术变迁。阅读此文,带你揭秘App性能测试。
6117 0
App性能测试揭秘(Android篇)
|
6月前
|
人工智能 安全 调度
1949AI 轻量化 AI 自动化办公场景应用方案 本地自动化工具与浏览器自动化实践
1949AI是一款轻量化AI办公自动化工具,基于Python实现,无需高性能算力,支持本地文件处理、网页数据抓取与Agent自主调度。模块化设计、低资源占用、全程离线运行,适配个人开发者与小型团队,安全合规、开箱即用。(239字)
|
6月前
|
人工智能 JSON 算法
商场智能美妆镜如何通过 AI API 实现从“看”到“买”的转化
在存量竞争时代,商场智能美妆镜正升级为“销售闭环控制台”。玩美移动(Perfect Corp.)提供云端AI试妆API,以S2S架构实现跨终端一致、环境自适应、极简集成;通过异步VTO任务链路,毫秒级输出高清试妆图,并赋能营销洞察、私域引流与精准转化。(239字)
287 2
|
人工智能 自然语言处理 供应链
网上管家婆客服部被AI“抢活”了!实测百宝箱智能体的提效魔法
网上管家婆联合蚂蚁百宝箱推出AI智能客服与语音转写智能体,实现售后咨询秒级响应、销售录音自动分析,大幅提升效率。智能体嵌入现有系统,零代码操作,助力客服摆脱重复劳动,聚焦高价值服务,真正实现人机协同提效。
473 0
|
9月前
|
消息中间件 人工智能 决策智能
AgentScope x RocketMQ:构建多智能体应用组合
AgentScope是阿里巴巴推出的开发者友好型多智能体框架,支持模块化、可定制的智能体应用开发。通过集成RocketMQ,实现高效可靠的A2A通信,助力构建如“智能旅行助手”等复杂协作场景,提升开发透明度与运行时可控性。(238字)
|
前端开发 Java API
基于 Spring Boot 3 与 React 的 Java 学生信息管理系统从入门到精通实操指南
本项目基于Spring Boot 3与React 18构建学生信息管理系统,涵盖前后端开发、容器化部署及测试监控,提供完整实操指南与源码,助你掌握Java全栈开发技能。
698 0
|
存储 算法 安全
硬盘数据恢复——硬盘固件区损坏的数据恢复方案
硬盘故障: 硬盘固件区损坏。 硬盘固件区损坏的故障表现: 1、硬盘寻道正常但无法正确识别自身型号或容量。 2、硬盘可以正常识别自身型号和容量但无法读取。
|
消息中间件 缓存 前端开发
评论系统如何不崩溃?揭开海量评论背后的技术秘密
小米介绍了一种高效处理海量新闻评论的技术方案。面对突发新闻带来的评论潮,通过采用消息队列异步入库、读写分离以及热点缓存等技术,不仅能有效减轻数据库压力,还能保证用户快速查看最新评论。消息队列如Kafka或RabbitMQ可缓存评论请求,后台异步处理入库,避免数据库过载。读写分离则通过主从数据库架构分散读取负载,配合热点评论的缓存机制进一步提升访问速度。这套架构确保了系统的稳定性和响应速度,适用于高并发的评论处理场景。
570 0
|
Web App开发 前端开发 JavaScript
浏览器之资源获取优先级(fetchpriority)(二)
浏览器之资源获取优先级(fetchpriority)(二)
692 0

热门文章

最新文章