C语言——qsort()函数用法

2023-10-31

一、qsort()函数的简介

qsort()函数是C语言库函数的排序函数,既然是排序函数那就有它排序的原理,比如:选择排序、冒泡排序、归并排序、快速排序等。这里qsort()函数底层原理是采用快速排序,下面让我们来了解一下qsort()函数。
在这里插入图片描述

由以上图可知:
引头文件:<stdlib.h>
功能:排序无序数组或字符串
参数:
1.base - 指向待排序数组或字符串的指针
2.num - base指针指向数组元素的个数
3.size - 数组中每个元素的大小,以字节为单位
4.compar - 用来比较两个函数的大小(自己定义实现)
返回值:该函数无返回值

二、qsort()函数实例

1.排序整形数组

#define M 10
#include <stdio.h>
#include <stdlib.h>
//整形数据排序
void cmp(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[M] = { 1,3,5,7,9,2,6,4,8,10 };
	int sz = sizeof arr / sizeof(arr[0]);
	printf("排序前 arr[] = [");
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("]\n");
	qsort(arr, sz, sizeof(int), cmp);
	printf("排序后 arr[] = [");
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("]\n");
	return 0;
}

结果:
在这里插入图片描述

2.排序double型数组

void cmp(const void* e1, const void* e2)
{
	return *(double*)e1 > *(double*)e2 ? 1 : -1;
}

int main()
{
	double arr[M] = { 1.1,3.2,5.4,7.1,9.6,2.5,6.3,4.8,8.1,10.6 };
	/*int sz = sizeof arr / sizeof(arr[0]);*///此时sizeof只能操作整形数据
	int sz = M;
	printf("排序前 arr[] = [");
	for (int i = 0; i < sz; i++)
	{
		printf("%.1lf ", arr[i]);
	}
	printf("]\n");
	qsort(arr, sz, sizeof(double), cmp);
	printf("排序后 arr[] = [");
	for (int i = 0; i < sz; i++)
	{
		printf("%.1lf ", arr[i]);
	}
	printf("]\n");
	return 0;
}

结果:
在这里插入图片描述

3.排序字符型数据

//字符型数据排序
void cmp(const void* e1, const void* e2)
{
	return *(char*)e1 - *(char*)e2;
}
int main()
{
	char str[] = "ahfimcv";
	int sz = strlen(str);
	printf("排序前:str[] = %s\n",str);
	qsort(str, sz, sizeof(str[0]), cmp);
	printf("排序后:str[] = %s\n", str);
	return 0;
}


结果:
在这里插入图片描述

4.结构体类型数据排序

struct Student
{
	char name[20];
	char num[20];
	int age;
};

//按名字首字母进行排序
int cmp_name(const void* e1, const void* e2)
{
	//使用trrcmp进行首元素比较
	return strcmp(((struct Student*)e1)->name, ((struct Student*)e2)->name);
}


int main()
{
	struct Student stu[3] = { {"zhangsan","001",18},{"lisi","002",19},{"wangwu","003",20} };
	int sz = sizeof stu / sizeof(stu[0]);
	printf("排序前:\n");
	for (int i = 0; i < sz; i++)
	{
		printf("%s %s %d", stu[i].name, stu[i].num, stu[i].age);
		printf("\n");
	}
	qsort(stu, sz, sizeof(stu[0]), cmp_name);
	printf("\n排序后:\n");
	for (int i = 0; i < sz; i++)
	{
		printf("%s %s %d", stu[i].name, stu[i].num, stu[i].age);
		printf("\n");
	}
	return 0;
}


结果:
在这里插入图片描述

三、使用冒泡排序模拟qsort()函数

Swap()函数:
(1)需要把每个交换的数据在内存中所占的字节数传过去 —— width
(2)因为要交换的数据类型未知,我们采用**一个字节一个字节进行交换**,所以把数据转换为char*较好
my_qsort()函数:
(1)void* base —— 接收待排序数组
(2)num —— 数组元素个数
(3)width —— 每个数据所占的字节数
(4)int(*cmp)(const void* e1, const void* e2) —— 定义一个比较函数,这里是函数指针
int cmp(const void* e1,const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

void Swap(void* buf1, void* buf2, int width)
{
	for (int i = 0; i < width; i++)
	{
		char tmp = *((char*)buf1 + i);
		*((char*)buf1 + i) = *((char*)buf2 + i);
		*((char*)buf2 + i)= tmp;
	}
}

void my_qsort(void* base, int num, int width, int(*cmp)(const void* e1, const void* e2))
{
	for (int i = 0; i < num - 1; i++)
	{
		for (int j = 0; j < num - i - 1; 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()
{
	int arr[10] = { 1,3,4,6,8,10,2,5,7,9 };
	printf("排序前:arr[] = [");
	int sz = sizeof arr / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("]\n");
	my_qsort(arr, sz, sizeof(arr[0]), cmp);
	printf("排序后:arr[] = [");
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("]\n");
	return 0;
}


结果展示:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言——qsort()函数用法 的相关文章

随机推荐

  • 数据挖掘背景知识2——数据挖掘可以做到什么 带给我们什么?

    本文是数据挖掘学习课堂笔记的一个补充 是一个了解级别的文章 欢迎各位大佬指出不足的地方 文章目录 数据挖掘的定义 数据挖掘与数据分析的区别 数据挖掘的应用场景 1 教育领域 2 风控领域 3 医疗领域 数据挖掘存在的问题 本文参考了CSDN
  • 什么是网络安全?

    一 什么是网络安全 1 网络安全 网络安全指网络系统中的硬件 软件以及系统中的数据受到保护 不因偶然或恶意的原因而遭到破坏 更改 泄露 系统连续可靠正常地运行 网络服务不中断 网络安全包括 网络设备安全 网络软件安全和网络信息安全 凡是涉及
  • js如何实现一个简单的节流函数?

    聚沙成塔 每天进步一点点 专栏简介 实现简单的节流函数 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅 这个专栏是为那些对Web开发感兴趣 刚刚踏
  • 解读startx

    X 的虚拟终端下的蜂鸣声可通过 xset b off 关闭 此命令 可放在 startx 的配置文件 HOME xinitrc 中 X 的虚拟终端下的蜂鸣声可通过 xset b off 关闭 此命令 可放在 startx 的配置文件 HOM
  • 07. 实战:Python正则法抓取某网站2022必看片迅雷种子

    目录 前言 URL 在评论区 URL 在评论区 URL 在评论区 目的 URL 在评论区 URL 在评论区 URL 在评论区 思路 URL 在评论区 URL 在评论区 URL 在评论区 代码实现 第一步 先导包 第二步 请求源代码 第三步
  • iwebsec靶场 SQL注入漏洞通关笔记7- 空格过滤绕过

    系列文章目录 iwebsec靶场 SQL注入漏洞通关笔记1 数字型注入 mooyuan的博客 CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记2 字符型注入 宽字节注入 mooyuan的博客 CSDN博客 iwebsec靶场 SQL
  • Linux实验:Shell编程

    对思考题4 8 进行编辑 然后执行 功能 输入的所有参数逆序输出显示 对思考题 4 14 进行编辑 然后执行 功能 显示裴波那契数列前10项及它们的和 对思考题4 18 进行编辑 然后执行 功能 输出输入字符串中抽取的第n个字符至第m个字符
  • 【python】考前复习,python基础语法知识点整理

    文章目录 1 常量与表达式 2 变量和数据类型 创建变量 数据类型 动态类型 数据类型的转换 3 注释 4 字符串 字符串的定义方式 字符串的拼接 字符串的格式化 字符串格式化的精度控制 字符串的格式化 对表达式进行格式化 5 从控制台输入
  • 【Android Jetpack】新一代导航管理——Navigation

    目录 前言 使用Navigation 创建导航视图 添加页面 添加导航 添加导航宿主 实现导航 原理解析 NavHostFragment 支持ToolBar 总结 前言 不知道小伙伴们是否注意到 用AS创建一个默认的新项目后 MainAct
  • 软件测试——性能测试

    性能测试基础 为什么要进行性能测试 WHY 最重要 应用程序是否能够很快的响应用户的要求 应用程序是否能处理预期的用户负载并有盈余能力 应用程序是否能处理业务所需要的事务数量 在预期和非预期的用户负载下 应用程序是否稳定 是否能够确保用户在
  • ISAAC WORKSPACE FILE

    Copyright 2019 NVIDIA CORPORATION All rights reserved NVIDIA CORPORATION and its licensors retain all intellectual prope
  • [需求管理-2]:什么是需求以及需求的收集与识别

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 需求管理 2 什么是需求以及需求的收集与识别 文火冰糖的硅基工坊的博客 CSDN博客 目录 第1章 什么是需求识别 第2章 需求的来源 2
  • 算法题 货仓选址(Python)

    题目 在一条数轴上有 N 家商店 它们的坐标分别为 A1 AN 现在需要在数轴上建立一家货仓 每天清晨 从货仓到每家商店都要运送一车商品 为了提高效率 求把货仓建在何处 可以使得货仓到每家商店的距离之和最小 输入格式 第一行输入整数N 第二
  • File类读取文件---本地文件和网络文件

    读取本地文件 File file new File resource audio 5 mp3 InputStream in null try 一次读多个字节 byte tempbytes new byte 100 int byteread
  • Vue项目开发环境安装、项目构建运行、打包部署详解

    Vue项目开发环境安装 项目构建运行 打包部署详解 背景 Vue工程化项目环境配置还是比较麻烦的 本篇来详细的记录下从0开始的安装 构建 打包 运行全过程 整体步骤 第一 安装Node js 这个是前端工程化项目运行的基础环境 第二 安装V
  • Java 网络编程 —— RMI 框架

    概述 RMI 是 Java 提供的一个完善的简单易用的远程方法调用框架 采用客户 服务器通信方式 在服务器上部署了提供各种服务的远程对象 客户端请求访问服务器上远程对象的方法 它要求客户端与服务器端都是 Java 程序 RMI 框架采用代理
  • 【程序员面试系列】算法题练习-汇总(含华为OD机试题目)

    做个4月算法刷题集合 方便复习巩固 欢迎交流探讨 题库源于牛客网 ACM模式 语言 Java Python 题库链接 HJ1 字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度 单词以空格隔开 字符串长度小于5000 注 字符串末
  • 如何修复损坏的word

    Word是许多人在日常工作中经常使用的软件 但有时它可能会出现意外的崩溃或文档损坏 这对于你正在编辑的文件和工作的进展都会产生重大影响 但是 你不需要过于担心 因为还是有一些方法可以通过修复Word文档中的损坏来解决这个问题 那么如何修复损
  • TCP三次握手,两次可以吗?

    这个问题网络上的回答超级多 众说纷纭 以 RFC 793 来回答这个问题可能更加准确 Reliability The TCP must recover from data that is damaged lost duplicated or
  • C语言——qsort()函数用法

    qsort函数简介及用法 一 qsort 函数的简介 二 qsort 函数实例 1 排序整形数组 2 排序double型数组 3 排序字符型数据 4 结构体类型数据排序 三 使用冒泡排序模拟qsort 函数 一 qsort 函数的简介 qs