一.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函数快速排序相关推荐

  1. 【C进阶】qsort函数详解

    ⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏+留言 ⭐系列专栏:C语言进阶 ⭐代码仓库:C Advanced 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们 ...

  2. qsort函数排序举例

    使用qsort函数快速排序应用举例 这篇博客是用qsort函数来快速排列float型数据,分别按照年龄(int型).姓名(char型)排列结构体.看懂就看懂,看不懂我也不想解释了. 简略解释一下qso ...

  3. C语言快速排序-qsort函数

    目录 一.qsort简介 二.qsort详解 1)函数原型 2)快速排序源码 三.使用qsort进行排序 目录 一.qsort简介 二.qsort详解 1)函数原型 2)快速排序源码 三.使用qsor ...

  4. C语言快速排序--qsort函数

    C语言快速排序–qsort函数 一.什么是qsort函数 qsort函数是C语言编译器函数库自带的快速排序函数. 其包含在#include<stdlib.h>头文件里面,所以在使用的时候需 ...

  5. C语言程序设计之标准库快速排序qsort函数用法示例

    C语言程序设计之标准库快速排序qsort函数,排序效率高,使用方便,太棒了. qsort函数定义如下: #include <stdlib.h>void qsort(void *base, ...

  6. c语言qsort函数(快速排序)

    c语言qsort函数(快速排序) 在学习c语言时我们常常会遇到一些排序的问题,在遇到这些排序的问题的时候,我们当然可以自己选择写出自己的排序方法来进行排序.但是我们今天要介绍的是c语言库函数中所提供的 ...

  7. 怎么样才能做到对多种数据类型排序?C语言快速排序——qsort函数及其模拟实现

    ⭐️前面的话⭐️ 大家好!对于排序有许多中方法,比如冒泡排序,选择排序,希尔排序,插入排序,堆排序等等,但是怎样能够使用一个函数能够对多个数据类型进行排序呢?无所不知的C语言开发者提供了一个qsort ...

  8. C语言标准库函数qsort(快速排序函数)

    文章目录 一.函数原型 二.函数解析 比较函数 三.手写快排 四.使用qsort 1.对int数组排序 2.对double数组排序 3.对char数组排序 4.对字符串排序 (1)char s[][] ...

  9. C语言 快速排序——qsort函数详解

    我们在使用冒泡排序法做题的时候,经常会遇到运算次数过多程序超时的情况,而且冒泡排序法只能对整形数组进行排序. 为了解决这些问题!就使用qsort函数吧! 目录 一.qsort函数使用方法 二.qsor ...

最新文章

  1. ModuleNotFoundError: No module named 'tools.nnwrap' pytorch 安装
  2. 计算机视觉与深度学习 | 基于控制点的投影畸变图像配准(matlab源码)
  3. Android布局大全
  4. 学习Java: Queue
  5. 【Web动画】SVG 实现复杂线条动画
  6. rmi反序列化导致rce漏洞修复_企业安全05-Fastjson =1.2.47反序列化RCE漏洞(CNVD-2019-22238)...
  7. Out of resources when opening file './xxx.MYD' (Errcode: 24)解决方法
  8. static与线程安全 -摘自网络
  9. 如何下载python模块_python中模块包的离线下载教程
  10. 深入理解SpringBoot启动机制(starter机制)
  11. Docker container 集装箱说明
  12. 简单的Java商城项目记录
  13. 历年研究生数学建模赛题题目
  14. 台式计算机关机后自行重启,台式电脑关机后自动重启的具体解决方法
  15. od反汇编linux,新手学习反汇编之OD寻找功能call
  16. C#“Multiple assemblies with equivalent identity have been imported”错误
  17. 上穿均线压力的大阳线特征:
  18. 团购网站暴信任危机:团购无效电影票
  19. CSS处理图片渲染时拉伸和挤压变形
  20. 中国各城市经纬度数据

热门文章

  1. MPV房产通证(Master Property Value)是什么?
  2. Grade Point Average
  3. 「生动形象」大白话讲解机器学习!
  4. IDEA在一个Project(工程)下创建多个Module(模块)
  5. P37-前端基础-浮动块元素和行内元素其他特点
  6. c语言宇航员,云顶之弈:神超狙神宇航员阵容解析,薇恩复出重回云顶C位
  7. css 清除浮动的几种方式
  8. RabbitMQ学习笔记(总结)
  9. word中如何取消页眉与上一节一样?
  10. synchronized(this)锁的是什么?同步静态方法,同步非静态方法,锁的都是什么?