【C语言】详解qsort函数
目录
- 一、什么是qsort
- 1.1、qsort函数的声明
- 1.2、qsort函数的参数
- 二、qsort函数的用法
- 1.1、qsort函数的实例
- 1.2、测试qsort函数排序结构体数据
- 1.3、用冒泡排序思想模拟实现qsort函数
一、什么是qsort
qsort函数是C语言标准提供的排序函数
它可以排序任意类型的数据
1.1、qsort函数的声明
void qsort( void * base,
size_t num,
size_t size,
int (* cmp)(const void * , const void *) );
1.2、qsort函数的参数
1、base:待排序数据的起始地址
2、num:待排序数据的元素个数
3、size:待排序数据元素的大小(单位是字节)
4、cmp:比较2给元素大小的函数指针
二、qsort函数的用法
1.1、qsort函数的实例
实例:
#include<stdio.h>
#include <stdlib.h>
int cmp_int(const void* e1, const void* e2)
{return (*(int*)e1 - *(int*)e2); // 升序//return (*(int*)e2-*(int*)e1); // 降序
}
void print(int* arr, int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[] = { 2,1,3,7,5,9,6,8,0,4 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_int);print(arr, sz);return 0;
}
1.2、测试qsort函数排序结构体数据
代码如下:
#include<stdio.h>
#include <string.h>
#include <stdlib.h>struct stu
{char name[20];int age;
};//按名字排序
int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name); // 升序
}//按年龄排序
//int cmp_stu_by_age(const void* e1, const void* e2)
//{// return ((struct stu*)e1)->age, ((struct stu*)e2)->age; // 升序
//}//输出结果
void print(struct stu* ss, int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s %d\n", ss[i].name, ss[i].age);}
}int main()
{struct stu s[] = { {"ZhangSan",20},{"LiSi",25},{"WangWu",35} }; int sz = sizeof(s) / sizeof(s[0]);//按名字比较qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);//按年龄比较//qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);print(s, sz);return 0;
}
按名字排序的输出结果:
按年龄排序的输出结果:
1.3、用冒泡排序思想模拟实现qsort函数
以下实例均是采用冒泡排序的思想,借鉴了qsort函数的设计思想,来实现对任意类型数据都可冒泡排序
实例1 (int 类型):
#include <stdio.h>//交换
void Swap(char* buf1, char* buf2, int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}//冒泡排序
void bubble_sort2(void* base, int sz, int width, int (*cmp)(const void* e1, const void* e2))
{int i = 0;//趟数for (i = 0; i < sz - 1; i++){//一趟冒泡排序的过程int j = 0;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 cmp_int(const void* e1, const void* e2)
{return (*(int*)e1 - *(int*)e2);
}//输出结果
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}int main()
{int arr[] = { 2,1,3,7,5,9,6,8,0,4 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort2(arr, sz, sizeof(arr[0]), cmp_int);print(arr, sz);
}
实例2(结构体):
#include <stdio.h>struct stu
{char name[20];int age;
};//交换
void Swap(char* buf1, char* buf2, int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}//冒泡排序
void bubble_sort2(void* base, int sz, int width, int (*cmp)(const void* e1, const void* e2))
{int i = 0;//趟数for (i = 0; i < sz - 1; i++){//一趟冒泡排序的过程int j = 0;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 cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name); // 升序
}//按年龄排序
//int cmp_stu_by_age(const void* e1, const void* e2)
//{// return ((struct stu*)e1)->age, ((struct stu*)e2)->age; // 升序
//}//输出结果
void print(struct stu* ss, int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s %d\n", ss[i].name, ss[i].age);}
}int main()
{struct stu s[] = { {"ZhangSan",20},{"LiSi",25},{"WangWu",35} };int sz = sizeof(s) / sizeof(s[0]);//按名字比较qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);//按年龄比较//qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);print(s, sz);return 0;
}
【C语言】详解qsort函数相关推荐
- 【C语言】详解qsort函数使用和模拟实现
一.qsort函数的使用 qsort的功能:qsort函数是C语言标准提供的排序函数 使用qsort函数需要引用头文件#include<stdlib.h> qsort函数能够排任意类型的数 ...
- C语言详解系列——函数的认识(4)函数的声明与定义,简单练习题
文章目录 函数的声明与定义 函数的声明 函数的定义 简单的练习题 写一个函数可以判断一个数是不是素数 写一个函数实现二分查找 写一个函数,每调用一次这个函数,就会将 num 的值增加1. 函数的声明与 ...
- C语言详解:函数递归专题
文章目录 函数递归 函数递归的定义和优缺点 递归的使用场景及必要条件 递归的细节说明 递归的习题讲解 1打印整数每一位 输入输出示例 解题思路 代码逻辑 2递归和非递归求n阶乘 输入输出示例 解题思路 ...
- C语言详解系列——函数的认识(5)函数递归与迭代
文章目录 函数递归 函数的迭代 函数递归 什么是函数递归?函数自己调用自己的编程技巧我们称为递归,函数递归通常会把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需要少量 ...
- c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构
1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,--,kj, 使得 ki是ki+1 的双亲(1<=i 从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它 ...
- smali语言详解之一般/构造方法(函数)的声明与返回值关键字
smali语言详解之一般/构造方法(函数)的声明与返回值关键字 一. smali语言的方法声明格式 .method与.end method成对出现,类似于java中的花括号 1.1.非静态的一般方法 ...
- 详解JMeter函数和变量
详解JMeter函数和变量(1) JMeter函数可以被认为是某种特殊的变量,它们可以被采样器或者其他测试元件所引用.函数调用的语法如下: ${__functionName(var1,var2,var ...
- c++指针详解_c语言详解sizeof
一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等. 它并不是函数. sizeof操作符以字节形式给出了其操作数的存储大小. 操作数可以是一个表达式或括在括 ...
- 如何用c语言编写stm32的程序吗,STM32入门C语言详解
<STM32入门C语言详解>由会员分享,可在线阅读,更多相关<STM32入门C语言详解(6页珍藏版)>请在人人文库网上搜索. 1.最新 料推荐阅读 flash : 芯片内部存储 ...
最新文章
- python实习做什么工作-大一/大二学生Python实习的困惑?
- 油井在哪_身边榜样 | 张景岗:“油井越‘生气,自己越开心”
- 给你一份超详细 Spring Boot 知识清单
- 在线文本差集计算工具
- Bailian2687 数组逆序重放【逆序处理】
- 电脑如何查看x86与arm_电脑关联程序更改 如何更改电脑查看图片的方式
- ios mysql注册登录界面_iOS学习2:创建属于自己的页面,自定义初始界面
- 混合编程:VS2017 C++调用Python3.X类/对象/函数笔记【Windows】
- 1.4. trac.ini
- java 继承特点_java 继承特点
- Harvest: A high-performance fundamental frequency estimator from speech signals
- Python爬虫获取PPT模板
- 在MyEclipse中,如何使用Git将项目上传到G码云仓库
- Java包装类 学习
- Spring Cloud Consul 注册服务failing,但是可以访问
- 如何同步公众号内容到头条自媒体?
- 这次彻底读透 Redis
- 在js中实现新窗口打开页面
- 前端工程师的 2018 年总结
- [Swift通天遁地]八、媒体与动画-(13)CoreText框架实现图文混排
热门文章
- 初识javaWeb:纯JSP+CSS+JS构建一个简单的电商平台
- fiddler模拟弱网2G和3G网络延迟设置
- kafka传递文件_Kafka权威指南(二)数据传递/数据管道/数据镜像
- 【Matplotlib绘制图像大全】(十六):Matplotlib绘制虚线折线图
- 用JavaScript清空数组
- 【0基础】学习solidity开发智能合约-初识solidity
- 判别式模型python_判别式模型与生成式模型的区别
- c++ 11 nullptr
- 北京开放大学非凡十年,谱写首都开放教育新篇章
- 简简单单----一个TMS320F28035的串口驱动程序