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

对任意类型数都可以排序的函数:qsort函数

之前我们学习过冒泡排序:

int main()
{int arr[] = { 9,7,8,6,5,4,3,2,1,0 };int sz = sizeof(arr)/sizeof(arr[0]);int i = 0;for (i = 0; i < sz-1; i++) {int j = 0;for (j = 0; j < sz-1-i; j++) {if (arr[j] > arr[j + 1]){int temp = 0;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}for (i = 0; i < sz; i++){printf("%d", arr[i]);}return 0;
}

可以看出这样的排序方法只适用于整形类型的数
那么是否有一种排序可以满足所有类型都适用的排序呢?

qsort函数排序
在这里插入图片描述
应用:
在这里需要补充一下void* 类型的指针
在这里插入图片描述

void in_mp(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]);}
}
void test1()
{int arr[] = { 9,6,7,8,5,3,4,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), in_mp);print(arr ,sz);
}
int main()
{test1();return 0;}

在这里插入图片描述
当然qsort函数排序既然可以实现任意类型,那么我们换几个类型试一下;
结构体类型

struct stu
{char name[20];int age;
};
void com_in(const void* p1, const void* p2)
{return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s %d ",arr[i].name, arr[i].age);}
}
void test2()
{struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), com_in);print(arr, sz);
}
int main()
{test2();return 0;
}

在这里插入图片描述
用冒泡排序的思想实现一个功能类似于qsort函数的排序
首先我们先讲一下qsort函数的原理
在这里插入图片描述
然后我们用冒泡排序的思想来改造

所以我们要自己创造一个qsort排序函数就要自己写一个可以排序任意类型数据的函数
我们用冒泡排序的思想来改造,就要解决一下问题

问题一
在这里插入图片描述
解决后:
在这里插入图片描述

问题2
在这里插入图片描述
解决:
在这里插入图片描述
代码:

//测试整形类型的的排序
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d", arr[i]);}
}
int in_mp(const void* p1, const void* p2)
{return(*(int*)p1 - *(int*)p2);}
tmp(char* put1, char* put2, int size)
{int i = 0;int temp = 0;for (i = 0; i < size; i++){temp = *put1;*put1 = *put2;*put2 = temp;put1++;put2++;}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{int i = 0;for (i = 0; i < sz - 1; i++) {int j = 0;for (j = 0; j < sz - 1 - i; j++){//把每一趟的两个对数传给In_mp函数如果大于0,升序的话就要交换if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0) {//交换tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);}}}
}
void test1()
{int arr[] = { 9,7,8,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bobble_sort(arr,sz,sizeof(arr[0]),in_mp);print(arr, sz);
}
int main()
{test1();return 0;
}

也可以测试结构体类型

tmp(char* put1, char* put2, int size)
{int i = 0;int temp = 0;for (i = 0; i < size; i++){temp = *put1;*put1 = *put2;*put2 = temp;put1++;put2++;}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{int i = 0;for (i = 0; i < sz - 1; i++) {int j = 0;for (j = 0; j < sz - 1 - i; j++){//把每一趟的两个对数传给In_mp函数如果大于0,升序的话就要交换if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0) {//交换tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);}}}
}//void test1()
//{
//	int arr[] = { 9,7,8,6,5,4,3,2,1,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bobble_sort(arr,sz,sizeof(arr[0]),in_mp);
//	print(arr, sz);
//}
struct stu
{char name[20];int age;
};int com_in(const void* p1, const void* p2)
{return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s %d ", arr[i].name, arr[i].age);}
}
void test2()
{struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };int sz = sizeof(arr) / sizeof(arr[0]);bobble_sort(arr, sz, sizeof(arr[0]), com_in);print(arr, sz);
}
int main()
{test2();return 0;
}
http://www.lryc.cn/news/115079.html

相关文章:

  • vue数据更新table内容不更新解决方法
  • 合宙Air724UG LuatOS-Air script lib API--record
  • 基于Vgg16和Vgg19深度学习网络的步态识别系统matlab仿真
  • Java分布式微服务3——Docker
  • js字符串替换
  • 网络防御(2)
  • [RCTF2019]DontEatMe
  • 6. CSS(三)
  • 计算机网络—HTTP
  • Tomcat线程池原理
  • 踩坑 视觉SLAM 十四讲第二版 ch13 编译及运行问题
  • 【设计模式】-装饰器模式
  • 七月学习总结
  • Camunda 7.x 系列【6】Spring Boot 集成 Camunda 7.19
  • Kubernetes —调度器配置
  • 【微信小程序】申请蓝牙、位置和数据库等相关权限
  • ORB-SLAM2学习笔记6之D435i双目IR相机运行ROS版ORB-SLAM2并发布位姿pose的rostopic
  • 【数据结构与算法——TypeScript】哈希表
  • JavaScript 中常用简写语法技巧总结
  • 漫画算法做题笔记
  • JDBC学习笔记
  • 亚信科技AntDB数据库与库瀚存储方案完成兼容性互认证,联合方案带来约20%性能提升
  • 【MySQL】基础知识(一)
  • Ansible专栏目录
  • 【locust】使用locust + boomer实现对接口的压测
  • 亿欧智库:2023中国宠物行业新趋势洞察报告(附下载)
  • 时序数据库 TDengine 与 WhaleStudio 完成相互兼容性测试认证
  • Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发
  • 负载均衡–HAProxy安装及搭建tidb数据库负载服务
  • Django各种缓存的配置