qsort的compare函数

2023-05-16

qsort的compare函数

功能:使用快速排序例程进行排序
头文件:stdlib.h
用法:void qsort( void base, size_t num, size_t width, int (__cdecl *compare )(const void , const void *) );
qsort 参数:
1. base 待排序数组首地址
2. num 数组中待排序元素数量
3. width 各元素的占用空间大小
4. compare 指向函数的指针,用于确定排序的顺序

一维数组

int comp(const void* a,const void* b){
    return *(int*)a-*(int*)b;
}

二维数组

//a[1000][2]
qsort(a,1000,sizeof(int)*2,comp);
int comp(const void* a,const void* b) {
   return((int*)a)[0]-((int*)b)[0];
}

qsort函数base不同,compare函数不同

对二维数组排序,base是数组首地址。compare函数

//按照[0]从小到大排序,当[0]相等时按[1]从大到小排序
int comp(const void* a, const void* b) {
    if (((int*)a)[0] == ((int*)b)[0])
        return ((int*)b)[1] - ((int*)a)[1];
    else
        return ((int*)a)[0] - ((int*)b)[0];
}

对二维数组排序,base是二维数组指针的首地址。compare函数

//按照[0]从小到大排序,当[0]相等时按[1]从大到小排序
int comp(const void* a, const void* b) {
    int *aa = *(int**)a;
    int *bb = *(int**)b;

    if (aa[0] == bb[0]) {
        return bb[1] - aa[1];
    }
    return aa[0] - bb[0];
}

//按照[0]从小到大排序,当[0]相等时按[1]从大到小排序
int comp(const void* a, const void* b) {
    if ((*(int**)a)[0] == (*(int**)b)[0])
        return (*(int**)b)[1] - (*(int**)a)[1];
    else
        return (*(int**)a)[0] - (*(int**)b)[0];
}

第二种方法的效率更高。

字符串

int comp(const void* p1,const void* p2){
   return strcmp((char*)p2,(char*)p1);
}

结构体1

struct Node{
    double data;
    int other;
}s[100];
int comp(const void* p1,const void* p2){
    return (*(Node*)p2).data>(*(Node*)p1).data?1:-1;
}

结构体2

struct Node{
    int x;
    int y;
}s[100];
//按照x从小到大排序,当x相等时按y从大到小排序
int comp(const void*p1,const void*p2)
{
    struct Node*c=(Node*)p1;
    struct Node*d=(Node*)p2;
    if(c->x!=d->x)returnc->x-d->x;
    else return d->y-c->y;
}

结构体3

struct Node{
    int data;
    char str[100];
}s[100];
//按照结构体中字符串str的字典序排序
int comp(const void*p1,const void*p2){
    return strcmp((*(Node*)p1).str,(*(Node*)p2).str);
}
qsort(s,100,sizeof(s[0]),comp);

计算几何中求凸包的comp

//重点comp函数,把除了1点外的所有的点旋转角度排序
int comp(const void*p1,const void*p2){
    struct point*c=(point*)p1;
    struct point*d=(point*)p2;
    if(cacl(*c,*d,p[1])<0) return1;
    elseif(!cacl(*c,*d,p[1])&&dis(c->x,c->y,p[1].x,p[1].y)<dis(d->x,d->y,p[1].x,p[1].y))
//如果在一条直线上,则把远的放在前面
    return1;
    else return-1;
}

总结

void指针转换为类型指针,取指针指向的值比较。

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

qsort的compare函数 的相关文章

  • 在 Ruby 中比较序列

    假设我必须 中小型 数组 tokens aaa ccc xxx bbb ccc yyy zzz template aaa bbb ccc 我怎样才能确定是否tokens包含所有条目template 按照同样的顺序 请注意 在上面的示例中 应
  • 比较法语字符 Î 时出现问题

    当比较 le 和 Ile 时 C 并不认为它们是相同的 string Equals le Ile StringComparison InvariantCultureIgnoreCase 对于所有其他带重音的字符 我发现比较效果很好 我还应该
  • java中同一数组的元素比较

    我正在尝试比较同一数组的元素 这意味着我想将 0 元素与其他所有元素进行比较 将 1 元素与其他所有元素进行比较 依此类推 问题是它没有按预期工作 我所做的是我有两个从 0 到 array length 1 的 for 循环 然后我有一个
  • 如何比较yaml文件中的键?

    有两个 Ruby on Rails 国际化 yaml 文件 一份文件完整 另一份文件缺少密钥 如何比较两个 yaml 文件并查看第二个文件中缺少的键 有没有工具可以做到这一点 假设file1是正确的版本并且file2是缺少密钥的版本 def
  • 如何检查字符串列表是否存在于两个单独的文件中

    我有两个文件 文件 A 是 IP 地址列表 同一行上有相应的 MAC 地址 文件 B 是仅包含 MAC 地址的列表 我需要比较这两个文件并列出文件 A 中没有在文件 B 中找到的 MAC 地址的行 FILE A 172 0 0 1 AA B
  • 检查一个数据帧是否是另一个数据帧的重新排序[重复]

    这个问题在这里已经有答案了 我有两个在两个不同场合生成的数据帧 但我怀疑它们是相等的 两者具有相同的行数和列数 从视觉上看它们似乎是相同的 除了行的排序方式不同 两者都没有可以重新排序的 ID 列 我能做的最好的事情就是通过process
  • 如何比较两个边缘图像(在 OpenCV 中)?

    在我的项目中 我需要与图像进行比较 一张图像显示渲染模型 另一张图像是照片 其中显示模型中表示的真实对象 我到底想要什么 该算法必须比较两个图像并返回一个描述相似度的数字 假设数字越低 图像就越吻合 两个图像都表示为二进制图像 仅包含真实渲
  • 在 Objective-C 中检查布尔值数组并查看是否至少有一个为 YES

    我有一个可变的布尔值数组 我想检查是否有任何值是 是 目前 我正在与这个数组一起创建另一个数组 它总是像这样全是假的 MyArray addObject NSNumber numberWithBool switchInput MyAllNo
  • 从一个 data.frame 中选择第二个 data.frame 中不存在的行

    我有两个数据框 a1 lt data frame a 1 5 b letters 1 5 a2 lt data frame a 1 3 b letters 1 3 我想找到 a1 有而 a2 没有的行 是否有针对此类操作的内置函数 注 我确
  • 比较 data.table 的两行并仅显示有差异的列[重复]

    这个问题在这里已经有答案了 我得到了一个大的 data table 其中包含不同类型的列 例如数字或字符 例如 data table name c A A val1 c 1 2 val2 c 3 3 cat c u v name val1
  • 比较两个数据库的结构?

    我想问是否可以比较两个巨大数据库的完整数据库结构 我们有两个数据库 一个是开发数据库 另一个是生产数据库 有时我会忘记在发布部分代码之前对生产数据库进行更改 这会导致生产数据库不具有相同的结构 因此如果我们发布某些内容 就会出现一些错误 有
  • 如何在Python中检测两个文件是否相同[重复]

    这个问题在这里已经有答案了 在这种情况下 对 md5sum file1 和 md5sum file2 进行系统调用并比较两个返回值是否足够 如果您想做的不仅仅是检测它们是否不同 或者不信任哈希解决方案 标准库中有一些名为difflib ht
  • C++ 字符串字面量相等检查?

    不是我们比较两个数组的方式 因为那只会比较地址 include
  • 在 R 中测试多个相同的列

    有没有一种简单的方法来测试身份multiple列 例如 通过这个输入 data data table one c 1 2 3 4 two c 7 8 9 10 three c 1 2 3 4 four c 1 2 3 4 有什么东西可以返回
  • 比较两个不同的音频文件不起作用

    我想比较两个音频文件 例如 mp3 和 wav 我用musicg https code google com p musicg 通过指纹进行比较 Wave record1 new Wave music1 toString Wave reco
  • 在 Ruby 中使用 >(大于号)比较两个字符串?

    我在我正在从事的一个项目中发现了一段看起来有点可怕的代码 它应该显示两个数字之间的 增量 但它使用的是 gt 比较数字字符串而不是数字 我假设代码目前按预期工作 所以我只是想了解 Ruby 在这种情况下如何比较这些字符串 这是替换变量的示例
  • python 2.7编码解码

    我有一个涉及编码 解码的问题 我从文件中读取文本并将其与数据库 Postgres 中的文本进行比较 比较在两个列表内完成 从文件中我得到 jo 的 jo x9a 从数据库中我得到相同值的 jo xc5 xa1 common a for a
  • 在Windows中比较2个二进制文件的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个工具来比较两个二进制文件 文件相当大 我在互联网上找到的一些免费软件或试用工具不方便用于大文件
  • 比较元胞数组中的字符串

    我试图在单词列表中找到最常见的单词 到目前为止 这是我的代码 uniWords unique lower words for i 1 length words for j 1 length uniWords if uniWords j lo
  • 如何在 C++ 中对字符串使用 qsort

    我想使用 qsort 函数使用 C 对字符串中的字符进行排序 include

随机推荐

  • 超好用的word插件-工作和科研

    Word精灵7 0版 可以很好地处理图片 xff0c 转换 xff0c 以及各种批量处理操作 GrammarlyAddInSetup 可以很好地校对英文错误 xff0c 单词以及语法错误 xff0c 但被动语态不太行 链接 xff1a ht
  • Adobe Premiere Pro 2023 SP(未完成)

    需要添加
  • 一个程序员所应该具备的精神

    所谓障碍都是主观上的 如果你想研发什么新的技术 xff0c 只需要在冰箱里放满食物和饮料 xff0c 再有一台便宜的计算机 xff0c 和以之献身的决心 xff0c 你即可拥有任何你想拥有的编程深度 xff01 John Carmack
  • ROS中的多线程

    ROS中的多线程 ROS多线程消息回调处理函数多线程MultiThreadedSpinnerAsyncSpinner callback传参timertimer加参数 C 43 43 中的多线程Python中的多线程 ROS使用master管
  • Linux系统下磁盘分区

    计算机的磁盘分区信息是计算机引导操作系统必须的信息 xff0c 根据引导方式的不同 xff0c 一般分别保存在MBR或者GPT中 其中 xff0c BIOS引导会读取MBR xff08 Main Boot Record xff09 中的磁盘
  • ROS中的tf发布读取转换

    ROS tf 基础使用查看tf信息1 创建link关系图2 在rqt中查看link关系图3 终端中输出tf变换关系4 rviz中查看 程序中使用TransformerTransformBroadcasterTransformListener
  • linux下shell脚本启动其他可执行程序

    linux下shell脚本启动其他可执行程序 零 前言一 C 43 43 代码二 shell脚本三 shell运行效果 零 前言 linux下的项目中经常需要使用shell脚本去启动其他程序的操作 xff0c 下面是自己编写的测试程序 xf
  • 嵌入式面试常见问题

    1 什么是嵌入式 以应用为中心 xff0c 以计算机技术为基础 xff0c 软硬件可裁剪 xff0c 适用于应用系统对功能 可靠性 成本 体积 功耗有严格要求的专用计算机系统 2 字符设备和块设备的区别 xff1f Linux里设备类型分
  • 步进电机和伺服电机的区别你知道吗?

    在许多领域都需要各种电机 xff0c 包括知名的步进电机和伺服电机 但是 xff0c 对于许多用户而言 xff0c 他们不了解这两种电机的主要区别 xff0c 因此他们始终不知道如何选择 那么 xff0c 步进电机和伺服电机之间的主要区别是
  • 独轮车成功站立

    真是废了不少力 卡了这么久首要原因就是过于青睐串级PID 串级PID可以自主寻找机械中位的特性实在是太优雅了 但动量轮这种对即使性要求极高的系统似乎不能用串级PID实现 昨天沉下心把串级PID推掉换成并联 xff0c 波形一下就朝着正常的方
  • 字节序:大端字节序(Big Endian) & 小端字节序(Little Endian)

    一 什么是字节序 xff1f 多字节数据存储在存储器中的顺序就叫做字节序 字节序又分为俩种 xff0c 一种叫做小端字节序 xff1b 另外一种叫做大端字节序 二 大端字节序 xff08 Big Endian xff09 amp 小端字节序
  • Google doc

    https docs google com spreadsheets d 1lOtc072A0QaJAXormoUeiaqZu5 20BR1ikh0YZe65PI edit gid 61 0
  • Boot Loader启动过程分析

    一 Boot Loader的概念和功能 1 嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分 xff1a xff08 1 xff09 引导加载程序 xff1a 其中包括内部ROM中的固化启动代码和Bo
  • eclipse:解决Ctrl+S 无法保存问题

    解决Ctrl 43 S 无法保存问题 工作中有一个同事的eclipse中无法使用Ctrl 43 S保存文件 xff0c 尝试了各种方法 xff0c 禁用了所有其他软件的快捷键 xff0c 依然无法解决 xff0c 最终发现是eclipse自
  • windbg学习笔记 FOR 内核调试(三) --进程句柄表HANDLE_TABLE

    windbg学习笔记 FOR 内核调试 三 进程句柄表HANDLE TABLE 想当年 初学核编 阅读第三章的内核对象的时候跟看天书没什么感觉 死命在想到底内核对象 句柄是个什么东西 干嘛用的 于是我们工作室的老大就对我说 这篇看过就过了
  • tx2 上 安装nvidia Isaac安装记录

    Isaac的功能挺多 xff0c 但是只支持最新的版本 xff0c 所以没办法 xff0c 只能装最新的了 下面就记录一下这个过程 安装环境真是很麻烦 xff0c 不是下载失败就是下载慢 一天基本安装不完 第一步安装1804 因为只支持18
  • 关于进程间的访问权限等进程间控制资料收集

    http www vckbase com DUPLICATEHANDLE函数可以实现将同步内核对象被拷贝并且将原内核对象关闭 xff0c 从而达到可以自由控制内核对象的目的 xff0c 这可以实现使得只能单一启用的进程成为多启用的进程的目的
  • IIC总线基础知识

    IIC总线基础知识 一 简介 IIC xff08 Inter Integrated Circuit xff09 是一个多主从的串行总线 xff0c 又叫I2C xff0c 是由飞利浦公司发明的通讯总线 xff0c 属于半双工同步传输类型总线
  • 常见RISC-V介绍

    当前一颗新出的CPU xff1a RISC V简直火透了半边天 xff0c 无论是财大气粗的阿里系的平头哥 xff0c 还是新创企业 xff0c 似乎只要和RISC V挂上钩就足可以实现赶英超美 那事实上RISC V是什么 xff1f 除了
  • qsort的compare函数

    qsort的compare函数 功能 xff1a 使用快速排序例程进行排序 头文件 xff1a stdlib h 用法 xff1a void qsort void base size t num size t width int cdecl