关于qsort函数

2023-11-09

1.qsort函数介绍

A.对应头文件<stdlib.h>

B.函数声明

void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));

base为比较内容开始位置的指针。

num为比较元素个数。

size为每个元素大小,单位是字节。

compar为比较函数的函数指针,需要我们自己编写,比较函数大于时返回大于0的数,小于时返回小于0的数,等于时返回0。

C.应用实例

truct peo
{
	char name[20];
	int age;
};
int cmp_stu_age(const void* e1, const void* e2)
{
	return ((struct peo*)e1)->age - ((struct peo*)e2)->age;
}
int main()
{
	struct peo stu[3] = { {"zhangsan",21}, {"lisi",34},{"wangwu",12} };
	int sz = sizeof(stu) / sizeof(stu[0]);
	qsort(stu, sz, sizeof(stu[0]), cmp_stu_age);//按年龄排序
	//比较函数大于时返回大于0的数,小于时返回小于0的数,等于时返回0
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%s ", stu[i].name);
		printf("%d ", stu[i].age);
		printf("\n");
	}
	return 0;
}

qsort排序根据比较函数决定,比较函数大于时返回大于0的数,小于时返回小于0的数,等于时返回0。

2.自制qsort函数

void Change(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 test1(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 + width * j, (char*)base + width * (j + 1)) > 0)
			{
				Change((char*)base + width * j, (char*)base + width * (j + 1), width);
			}
		}
	}
}

因为void*指针不能进行加减操作,也就是无法让其移动。我们可以将其强制转换成char*类型,一个字节一个字节进行移动,配上一个元素字节大小width实现移动目的。

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

关于qsort函数 的相关文章

  • Unity3D StartCoroutine 调用一个函数,该函数什么时候返回?

    我知道Unity3D StartCoroutine调用了一个与StartCoroutine在同一线程上运行的函数 但是被调用的函数什么时候返回到原始调用者 我在互联网上查找了一个很好的 Unity3D Coroutine 示例 但找不到完整
  • 以相反的顺序迭代可变参数模板参数

    如果我手动反转传递给它的模板参数的顺序 以下代码将起作用 template
  • SL4 AutoCompleteBox 重复筛选结果问题

    我在 AutoCompleteBox 过滤方面遇到问题 它似乎记住了之前的过滤器 例如 我输入 A 它会返回 1 项 我删除 A 并输入 Z 这应该返回 1 项 问题是它返回 A 过滤器加上 Z 的结果 我删除 Z 并输入 S 这会带回 2
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 将成员函数作为参数传递/c++

    我想用 C 实现一个类b可以通过封装该迭代器类型的成员集进行某种迭代 喜欢 b object for each x do function f so 函数 f会得到每个人的x成员并做任何事情 比方说 void function f x me
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 不要声明只读可变引用类型 - 为什么不呢?

    我一直在阅读这个问题 https stackoverflow com questions 2274412 immutable readonly reference types fxcop violation do not declare r
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • 探索珠宝商城小程序:商家如何实现线上卖珠宝

    近期 微信小程序的发展势头强劲 各行各业都在积极开发自己的小程序 以适应这个数字化的时代 珠宝行业也不例外 许多珠宝品牌都已经推出了自己的小程序 为用户提供了更加便捷 个性化的购物体验 因此 制作一款珠宝商城小程序 不仅是顺应潮流的选择 也
  • go+goquery+chromedp爬虫实现对网页数据抓取

    安装 首先 需要安装两个包 1 goquery go get github com PuerkitoBio goquery goquery包主要用于搜索界面上的元素 获取里面的值 具体操作可以参考 飞雪无痕 的 golang goquery
  • IPv6头部

    一 IPv6数据包的结构 IPv6报文 分为三个部分 头部 扩展头 上层协议数据单元 IPv4报文 头部 上层协议数据单元 IPv6头部始终存在 大小固定40字节 扩展头可能有0个或多个 且长度不固定 二 IPv6头部 1 结构 2 域 P
  • ORALCE函数:LAG()和LEAD() 分析函数详解

    Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据 Lag 和后N行的数据 Lead 作为独立的列 在实际应用当中 若要用到取今天和昨天的某字段差值时 Lag和Lead函数的应用就显得尤为重要 当然 这种操作可以用表的自连
  • SpringBoot整合RabbitMQ详细案例(入门RabbitMQ看这一篇就够了)

    SpringBoot整合RabbitMQ详细案例 入门RabbitMQ看这一篇就够了 1 RabbitMQ的使用场景 1 1 异步处理 1 2 应用解耦 1 3 流量削峰 2 RabbitMQ 交换机介绍 2 1 Direct exchan
  • 第3课 微信开发者工具picker标签实现动态时间选择器与地区选择器:

    微信小程序picker标签实现动态时间选择器与地区选择器 运行效果如下 wxml代码如下
  • Vue实现搜索页面

    目录 一 效果 二 实现 一 效果 实现功能如下图所示 因为被腰斩 样式未调整 二 实现 直接上代码 pages Search vue 搜索页
  • remote: Support for password authentication was removed on August 13, 2021

    1 github在2021年8月14日七夕这天搞事情 如果这天你提交了github代码报错如下 问题 remote Support for password authentication was removed on August 13 2
  • 报错: ‘XXXX‘ is declared but its value is never read.Vetur(6133)

    引入的路径本没有问题 结果确报错 解决方法如下 1 在VScode工具的设置中找到设置 2 在搜索栏输入 vetur 并找到Vertur gt Validation Script 在比较靠下多滑动页面哦 3 最后关闭项目重新打开即可 报错消
  • 【C语言】如何使用 Visual studio 2019 编写,并编译和运行C代码?

    提示 该文章以 Visual studio 2019为例来进行说明 2019及以后的版本同样适用该文章 文章目录 一 创建一个新项目 二 在项目里创建一个源文件 三 编写C语言代码 四 编译和运行代码 五 将旧项目中的C文件添加到新项目中
  • [CISCN 2022 初赛]online_crt

    文章目录 涉及知识点 代码审计 解题过程 涉及知识点 CVE 2022 1292漏洞 OpenSSL ssrf 代码审计 app py源码 import datetime import json import os import socke
  • 权限篇

    权限篇 root 系统超级用户 UID为0 普通用户由root创建 UID从1000开始累计 系统中虚拟用户UID在1 999之间 由操作系创建 用户配置文件 etc passwd 新创建的用户 信息会追加到这个文件结尾 sbin nolo
  • Git更新国内清华源

    sudo sed i s http archive ubuntu com https mirrors tuna tsinghua edu cn g etc apt sources list sudo sed i s http securit
  • 浏览器network报错:ERR_CERT_AUTHORITY_INVALID

    1 今天遇到个问题在访问自己写的网站时 其中有个获取验证码功能 是后端Https接口 请求没到后端 浏览器报了Failed to load resource net ERR CERT AUTHORITY INVALID 临时解决办法 1 其
  • 深入理解Java虚拟机jvm-栈溢出-栈帧过多java.lang.StackOverflowError

    栈溢出 示例 虚拟机参数 结果 原因分析 示例 栈溢出 栈帧过多 栈内存过小 每个方法被执行的时候 Java虚拟机都会同步创建一个栈帧 1 Stack Frame 用于存储局部变量表 操作数栈 动态连接 方法出口等信息 java lang
  • CSDN常用字体设置

    一 字体设置 font face 微软雅黑 color FF8C00 size 3 在这里放入需要修改颜色的语句 font 效果 在这里放入需要修改颜色的语句 face 是调节字体类型 可随意改写 楷体 黑体 微软雅黑 宋体等 color
  • 贝叶斯网络之父Judea Pearl力荐、LeCun点赞,这篇长论文全面解读机器学习中的因果关系

    选自arXiv 作者 Bernhard Sch lkopf机器之心编译 机器之心编辑部 本文认为机器学习和人工智能领域中的待解难题本质上与因果关系有关 图灵奖得主 贝叶斯网络之父 Judea Pearl 曾自嘲自己是 AI 社区的反叛者 因
  • C++ 可扩展的内存缓冲区

    类声明 CMemBuffer h pragma once class CMemBuffer public CMemBuffer DWORD dwSize 0 CMemBuffer void 申请内存 BOOL Realloc DWORD d
  • 服务器测速

    一键测试服务器到国内的速度脚本Superspeed sh wget https raw githubusercontent com oooldking script master superspeed sh chmod x superspe
  • 关于qsort函数

    1 qsort函数介绍 A 对应头文件