当前位置: 首页 > news >正文

运用qsort函数对任意数据进行排序

#该内容是根据是听完比特课后,进行整理再加以自己的补充

qsort函数对任意数据进行排序

qsort函数介绍

qsort函数是专门用来对任意数据进行排序的函数,包括整型、浮点型、字符串、结构体函数等

qsort函数 void qsort(void* base,//base指向待排序数组的第一个元素的指针 size_t num,//base指向的数组的元素个数 size_t size,//base指向的数组中一个元素的大小,字节的长度 int(*cmp)(count void*,condt void*)//函数指针--传递函数的地址 );

对整型数组进行排序

#include <stdio.h> #include <stdlib.h>//使用qsort函数时需要包含的头文件 #define N 10 void input_arr(int *arr,int sz) { printf("请输入%d个数据\n",N); for(int i = 0;i < sz;++i) { scanf("%d",arr+i); } } int cmp_qsort(const void*p1,const void*p2) { return (*(int *)p1-*(int *)p2); } void print_arr(int *arr,int sz) { for(int i = 0;i < sz;++i) { printf("%-3d",arr[i]); } } void test1() { int arr[N] = {0}; int sz = sizeof(arr) / sizeof(arr[0]); input_arr(arr,sz); qsort(arr,sz,sizeof(arr[0]),cmp_qsort); print_arr(arr,sz); } int main(void) { test1(); return 0; }

对结构体函数进行排序

分别通过姓名和年龄进行排序

//通过名字进行排序 #include <stdio.h> #include <stdlib.h> #include <string.h> struct stu { char name[10]; int age; };//构造一个结构体包含名字和年龄两个变量 int cmp_by_name_qsort(const void*p1,const void*p2) { return strcmp(((struct stu*)p1)->name,((struct stu*)p2)->name);//对于字符串运用strcmp函数进行比较,使用时要包含头文件string.h } void test2() { struct stu arr[] = {{"zhangsan",20},{"wangwu",22},{"lisi",18}}; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr,sz,sizeof(arr[0]),cmp_by_name_qsort); for(int i = 0;i < sz;++i) { printf("%s %d\n",arr[i].name,arr[i].age);//对排序后的结构体函数进行输出 } } int main(void) { test2(); return 0; } //通过年龄进行排序 #include <stdio.h> #include <stdlib.h> struct stu { char name[10]; int age; }; int cmp_by_age_qsort(const void*p1,const void*p2) { return ((struct stu*)p1)->age-((struct stu*)p2)->age; } void test2() { struct stu arr[] = {{"zhangsan",20},{"wangwu",22},{"lisi",18}}; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr,sz,sizeof(arr[0]),cmp_by_age_qsort); for(int i = 0;i < sz;++i) { printf("%s %d\n",arr[i].name,arr[i].age); } } int main(void) { test2(); return 0; }

对冒泡排序函数进行改造

改造前

#include <stdio.h> void input_arr(int *arr,int sz) { for(int i = 0;i < sz;++i) { scanf("%d",&arr[i]); } } void bubble_sort(int *arr,int sz) { for(int i = 0;i < sz - 1;++i) { int flag = 1; for(int j = 0;j < sz - 1 - i;++j) { if(arr[j] > arr[j + 1]) { flag = 0; int temp = arr[j]; arr[j] = arr[j +1]; arr[j +1] = temp; } } if(flag == 1) { break; } } } void print_arr(int *arr,int sz) { for(int i = 0;i < sz;++i) { printf("%-3d",arr[i]); } printf("\n"); } int main(void) { int arr[10] = {0}; int sz = sizeof(arr) / sizeof(arr[0]); input_arr(arr,sz); print_arr(arr,sz); bubble_sort(arr,sz); print_arr(arr,sz); return 0; }

改造后

对整型数组进行排序

#include <stdio.h> #include <string.h> #include <stdlib.h> int cmp_qsort(const void *p1,const void *p2) { return (*(char*)p1-*(char*)p2); } void swap(char*buf1,char*buf2,size_t width) { char tmp = 0; for(int i = 0;i < width;++i) { tmp = *buf1; *buf1 = *buf2; *buf2 = tmp; buf1++; buf2++; } } print_arr(int *arr,int sz) { for(int i= 0;i < sz;++i) { printf("%d",arr[i]); } } void bubble_sotr(void *base,size_t sz,size_t width,int(*cmp)(const void *p1,const void *p2)) { for(int i = 0;i < sz - 1;++i) { for(int j = 0;j < sz - 1 -i;++j) { if(cmp((char*)base+width*j,(char*)base+width*(j+1))>0) swap((char*)base+width*j,(char*)base+width*(j+1),width); } } } void test() { int arr[10] = {9,8,7,6,5,4,3,2,1,0}; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sotr(arr,sz,sizeof(arr[0]),cmp_qsort); print_arr(arr,sz); } int main(void) { test(); return 0; }

对结构体数据进行排序(按照姓名)

#include <stdio.h> #include <string.h> #include <stdlib.h> struct stu { char name[20]; int age; }; void swap(char*buf1,char*buf2,size_t width) { char tmp = 0; for(int i = 0;i < width;++i) { tmp = *buf1; *buf1 = *buf2; *buf2 = tmp; buf1++; buf2++; } } int cmp_qsort_by_name(const void *p1,const void *p2) { return strcmp(((struct stu*)p1)->name,((struct stu*)p2)->name); } void bubble_sotr(void *base,size_t sz,size_t width,int(*cmp)(const void *p1,const void *p2)) { for(int i = 0;i < sz - 1;++i) { for(int j = 0;j < sz - 1 -i;++j) { if(cmp((char*)base+width*j,(char*)base+width*(j+1))>0) swap((char*)base+width*j,(char*)base+width*(j+1),width); } } } void test() { struct stu arr[] = {{"zhangsan",20},{"wangwu",36},{"lisi",18}}; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sotr(arr,sz,sizeof(arr[0]),cmp_qsort_by_name); for(int i =0;i <sz;++i) { printf("%s %d",arr[i].name,arr[i].age); printf("\n"); } } int main(void) { test(); return 0; }
http://www.cnnetsun.cn/news/2112389.html

相关文章:

  • 网络编程模型比较
  • 从BUCK到BOOST:手把手教你用LTspice仿真DCDC三大拓扑,搞定电感电容选型难题
  • 三步彻底解锁惠普OMEN游戏本性能:OmenSuperHub终极指南
  • 魔兽世界宏编辑器终极指南:3个步骤让你告别复杂技能循环
  • 算法训练营第十四天| 18.四数之和
  • 别再傻傻分不清了!一文讲透SAP FICO里的替代、校验、BTE和出口增强到底怎么选
  • Neuron-AI:专为边缘计算打造的高性能AI推理引擎实战指南
  • APKMirror:如何打造你的Android应用时光机?终极免费解决方案揭秘
  • 每日极客日报 · 2026年04月27日
  • 暗黑破坏神2存档编辑器完全手册:5分钟掌握角色定制终极技巧
  • 抖音视频批量下载完整指南:如何快速保存喜欢的短视频内容
  • 【MySQL 数据库】环境安装教程
  • 终极教程:3步用Photon-GAMS光影包将Minecraft变成电影级视觉盛宴
  • Unlock Music:浏览器端音乐格式解密的架构设计与工程实践
  • NCCL Inspector:分布式AI训练通信性能观测与优化
  • 从RRU到直放站:实战中TDD开关配置与光纤拉远距离的避坑指南
  • Android 11/12/13 手机忘记WiFi密码?不用Root,教你从系统文件里找回(附XML解析方法)
  • 告别云服务器:用华为RH1288V3搭建个人媒体库,实战KVM安装与XFCE/DDE图形界面避坑指南
  • 英特尔股价创新高背后:算力变局、代工业务与市场定价的多重考量
  • TQVaultAE:泰坦之旅玩家的智能装备管家,轻松管理无限仓库
  • Proteus 8.9 + Arduino UNO 仿真避坑指南:手把手搭建一个会转电机的气压监测系统
  • 别再用pip install basicsr了!遇到Preparing metadata卡住,试试这个万能解法
  • 用Fakelocation和MuMu模拟器搞定KEEP跑步记录:一个懒人的完整配置与避坑实录
  • DS4Windows终极指南:3分钟让PS手柄在Windows电脑上完美运行
  • Sunshine游戏串流服务器架构解析:跨平台低延迟流媒体技术实现与性能优化
  • Qt实战:手把手教你用C++实现公历农历互转(附完整源码解析)
  • CompressO:开源跨平台视频压缩工具,如何将视频文件减少95%体积?
  • 三大维度解锁游戏资源编辑:ExtractorSharp从入门到精通
  • 大语言模型混合架构:显式记录与最大熵方法优化
  • 如何快速掌握Retrieval-based-Voice-Conversion-WebUI:AI音频转换的终极指南