利用qsort函数快速排序
一.qsort函数的类型及参数
void qsort(void *base,size_t num,size_t width,int (*compare)(const void* elem1),const void* elem2)
1.第一个参数base:待排序数组的首元素的地址,数据类型为void*。
2.第二个参数 num:待排序数组的元素个数,数据类型为size_t(unsigned int)。
3.第三个参数width:待排序数组的每个元素的字节大小,数据类型为size_t。
4.第四个参数compare:一个函数指针,函数功能为:比较数组中的两个元素。(需要自己实现)。函数的参数有两个,类型为const void* ,分别为待比较的两个元素的地址。
二.qsort函数的应用
1.利用qsort函数对整型数组排序
#include <stdio.h>
int compare(const void* elem1,const void* elem2)
{return *(int*)elem1-*(int*)elem2;
}
int main()
{ int i=0;int a[10]={2,1,3,5,6,4,8,7,9,0};int sz=sizeof(a)/sizeof(a[0]);qsort(a,sz,sizeof(a[0]),compare);for(i=0;i<sz;i++){printf("%d ",a[i]);}return 0;
}
运行结果:
2.利用qsort函数对字符数组排序
#include <stdio.h>
int compare(const void* elem1,const void* elem2)
{return *(char*)elem1-*(char*)elem2;
}
int main()
{ int i=0;char c[10]={'n','m','d','i','t','b','c','a','g','f'};int sz=sizeof(c)/sizeof(c[0]);qsort(c,sz,sizeof(c[0]),compare);for(i=0;i<sz;i++){printf("%c ",c[i]);}return 0;
}
运行结果:
三.模拟实现qsort函数(冒泡排序)
void swap(char* buf1, char* buf2,int n)//交换两个元素
{int i;for (i = 0; i < n; i++){char temp=*buf1;*buf1 = *buf2;*buf2 = temp;buf1++;buf2++;}
}
//利用冒泡排序实现
void bubble_sort(void* base, size_t sz, size_t width, int(*cmp)(const void* elem1,const void* elem2))
{int i = 0;int j = 0;for (i = 0; i < sz-1; i++){for (j = 0; j < sz - 1 - i; j++){if (cmp((char*)base + j*width, (char*)base + (j + 1)*width)>0)//(char*)base + j*width为第一个元素,(char*)base + (j + 1)*width为下一个元素swap((char*)base + j*width, (char*)base + (j + 1)*width, width);}}
}
测试
用上述代码对结构体数组排序
#include <string.h>
#include <stdio.h>
struct Stu
{char name[20];int age;
};
//通过姓名比较
int cmp_by_name(const void *elem1, const void *elem2)
{return strcmp(((struct Stu*)elem1)->name,((struct Stu*)elem2)->name);
}
//通过年龄比较
int cmp_by_age(const void *elem1, const void *elem2)
{return ((struct Stu*)elem1)->age,((struct Stu*)elem2)->age;
}
void swap(char*buf1, char*buf2,int n)
{int i;for (i = 0; i < n; i++){char temp=*buf1;*buf1 = *buf2;*buf2 = temp;buf1++;buf2++;}
}
void bubble_sort(void* base, int sz, int width, int(*cmp)(const void* elem1,const void* elem2))
{int i = 0;int j = 0;for (i = 0; i < sz-1; i++){for (j = 0; j < sz - 1 - i; j++){if (cmp((char*)base + j*width, (char*)base + (j + 1)*width)>0)swap((char*)base + j*width, (char*)base + (j + 1)*width, width);}}
}
int main()
{struct Stu s[3] = { { "zhangsan", 10 }, { "aishi", 20 }, { "wangwu", 30 } };int sz = sizeof(s) / sizeof(s[0]);bubble_sort(s, sz, sizeof(s[0]),cmp_by_name);for (int i = 0; i < sz; i++){printf("%s ", (s+i)->name);}return 0;
}
运行结果:
总结
传统的冒泡排序只能对单一数据类型的数组进行排序,如果要对另一数据类型的数组进行排序,就要重新写一个冒泡排序,这难免有些复杂。而qsort利用char数据类型只占用一个字节的特点,其他数据类型都可用此表示(例如上面代码中的(char*)base + j*width),将传入的参数用void*类型的指针接收,再将其强制转换成原数据类型,就可解决传统冒泡排序解决不了的问题。
(附:第一次发表博客,请多多包涵,如有错误的地方,欢迎指正,感谢您的阅读)
利用qsort函数快速排序相关推荐
- 【C进阶】qsort函数详解
⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏+留言 ⭐系列专栏:C语言进阶 ⭐代码仓库:C Advanced 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们 ...
- qsort函数排序举例
使用qsort函数快速排序应用举例 这篇博客是用qsort函数来快速排列float型数据,分别按照年龄(int型).姓名(char型)排列结构体.看懂就看懂,看不懂我也不想解释了. 简略解释一下qso ...
- C语言快速排序-qsort函数
目录 一.qsort简介 二.qsort详解 1)函数原型 2)快速排序源码 三.使用qsort进行排序 目录 一.qsort简介 二.qsort详解 1)函数原型 2)快速排序源码 三.使用qsor ...
- C语言快速排序--qsort函数
C语言快速排序–qsort函数 一.什么是qsort函数 qsort函数是C语言编译器函数库自带的快速排序函数. 其包含在#include<stdlib.h>头文件里面,所以在使用的时候需 ...
- C语言程序设计之标准库快速排序qsort函数用法示例
C语言程序设计之标准库快速排序qsort函数,排序效率高,使用方便,太棒了. qsort函数定义如下: #include <stdlib.h>void qsort(void *base, ...
- c语言qsort函数(快速排序)
c语言qsort函数(快速排序) 在学习c语言时我们常常会遇到一些排序的问题,在遇到这些排序的问题的时候,我们当然可以自己选择写出自己的排序方法来进行排序.但是我们今天要介绍的是c语言库函数中所提供的 ...
- 怎么样才能做到对多种数据类型排序?C语言快速排序——qsort函数及其模拟实现
⭐️前面的话⭐️ 大家好!对于排序有许多中方法,比如冒泡排序,选择排序,希尔排序,插入排序,堆排序等等,但是怎样能够使用一个函数能够对多个数据类型进行排序呢?无所不知的C语言开发者提供了一个qsort ...
- C语言标准库函数qsort(快速排序函数)
文章目录 一.函数原型 二.函数解析 比较函数 三.手写快排 四.使用qsort 1.对int数组排序 2.对double数组排序 3.对char数组排序 4.对字符串排序 (1)char s[][] ...
- C语言 快速排序——qsort函数详解
我们在使用冒泡排序法做题的时候,经常会遇到运算次数过多程序超时的情况,而且冒泡排序法只能对整形数组进行排序. 为了解决这些问题!就使用qsort函数吧! 目录 一.qsort函数使用方法 二.qsor ...
最新文章
- ModuleNotFoundError: No module named 'tools.nnwrap' pytorch 安装
- 计算机视觉与深度学习 | 基于控制点的投影畸变图像配准(matlab源码)
- Android布局大全
- 学习Java: Queue
- 【Web动画】SVG 实现复杂线条动画
- rmi反序列化导致rce漏洞修复_企业安全05-Fastjson =1.2.47反序列化RCE漏洞(CNVD-2019-22238)...
- Out of resources when opening file './xxx.MYD' (Errcode: 24)解决方法
- static与线程安全 -摘自网络
- 如何下载python模块_python中模块包的离线下载教程
- 深入理解SpringBoot启动机制(starter机制)
- Docker container 集装箱说明
- 简单的Java商城项目记录
- 历年研究生数学建模赛题题目
- 台式计算机关机后自行重启,台式电脑关机后自动重启的具体解决方法
- od反汇编linux,新手学习反汇编之OD寻找功能call
- C#“Multiple assemblies with equivalent identity have been imported”错误
- 上穿均线压力的大阳线特征:
- 团购网站暴信任危机:团购无效电影票
- CSS处理图片渲染时拉伸和挤压变形
- 中国各城市经纬度数据