c/c++中 qsort 与 bsearch 算法的使用

------------------------------------------------------------
author: hjjdebug
date:   2023年 12月 13日 星期三 17:30:41 CST
descriptor: qsort & bsearch 算法的使用
------------------------------------------------------------
qsort 用来排序,bsearch用来搜索,是这个意思,但具体怎样使用呢?
qsort 不仅可以用来排序一个整数数组,还可以排序一个结构数组.例子中给出了使用方法.
它真的会在内存中把数据不断的搬移来完成数据的排序.
如果你觉得排序结构数组比较浪费时间,可以让它排序指针.

qsort 在/usr/include/stdlib.h 中定义,
排序数组基地址为base, 数组元素个数nmemb, 每个元素大小为size, 用__compar来比大小
/* Sort NMEMB elements of BASE, of SIZE bytes each,
   using COMPAR to perform the comparisons.  */
extern void qsort (void *__base, size_t __nmemb, size_t __size,
           __compar_fn_t __compar) __nonnull ((1, 4));

bsearch 在/usr/include/stdlib.h 中定义, 就在qsort 函数的上方
bsearch 二分搜索方法,是需要一个排序的数组的,所以先排序数组,然后让bsearch 搜索key
告诉它比较大小的方法,它就能返回能不能找到这个key了
二进制搜索一个key, 在BASE地址, 元素个数NMEMB, 元素大小SIZE,比较函数__COMPAR
/* Do a binary search for KEY in BASE, which consists of NMEMB elements
   of SIZE bytes each, using COMPAR to perform the comparisons.  */
extern void *bsearch (const void *__key, const void *__base,
              size_t __nmemb, size_t __size, __compar_fn_t __compar)

有了这么好的功能,我们要利用起来, 下面是样例代码:

$ cat main.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
 *  用途: 在命令行输入月份的简写, 它会告诉你是几月.
 *  例如: ./bsearch aug , 会输出 8
 *  实现方法: 当然是先建立一个表,然后让它找了.
 *  由于这个表是我们人类方便查阅的方式给出的,为了编程的需要,先把它按月份名称的ascii顺序排序,
 *  然后就可以用二分法来查找这个表了.
 *  使用了c库中的qsort 函数, bsearch 函数
 */
//定义一个"月份信息" 结构 month_info, 月份号,月份名称
struct month_info {
    int nr;
    const char *name;
} months[] = {
    { 1, "jan" }, { 2, "feb" }, { 3, "mar" }, { 4, "apr" },
    { 5, "may" }, { 6, "jun" }, { 7, "jul" }, { 8, "aug" },
    { 9, "sep" }, {10, "oct" }, {11, "nov" }, {12, "dec" }
};

#define nr_of_months (sizeof(months)/sizeof(months[0]))

//"月份信息" 变量"大小"比较, 就是它们的名字比较
static int comp_mi(const void *m1, const void *m2)
{
    struct month_info *mi1 = (struct month_info *) m1;
    struct month_info *mi2 = (struct month_info *) m2;
    return strcmp(mi1->name, mi2->name);
}

int main(int argc, char **argv)
{
    printf("before sort:\n");
    for(size_t i=0;i<nr_of_months;i++)
    {
        printf("#%d,%s ",months[i].nr,months[i].name);
    }
    printf("\n");
    //按照ascii 顺序把结构数组重新排序
    qsort(months, nr_of_months, sizeof(struct month_info), comp_mi);
    printf("after sort:\n");
    for(size_t i=0;i<nr_of_months;i++)
    {
        printf("#%d,%s ",months[i].nr,months[i].name);
    }
    printf("\n");
    for (int i = 1; i < argc; i++) {
        struct month_info key, *res;
        key.name = argv[i];
        res = (struct month_info *)bsearch(&key, &months, nr_of_months, sizeof(struct month_info), comp_mi);
        if (res == NULL)
            printf("'%s': unknown month\n", argv[i]);
        else
            printf("%s: month #%d\n", res->name, res->nr);
    }
    exit(EXIT_SUCCESS);
}

下面是执行结果:
$ ./bsearch aug jan
before sort:
#1,jan #2,feb #3,mar #4,apr #5,may #6,jun #7,jul #8,aug #9,sep #10,oct #11,nov #12,dec 
after sort:
#4,apr #8,aug #12,dec #2,feb #1,jan #7,jul #6,jun #3,mar #5,may #11,nov #10,oct #9,sep 
aug: month #8
jan: month #1
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2k小权值和

package tgb.第二章;import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class okt2k小权值和 {static int N(int) (2e57); // static Map<Integer, Integer> S new HashMap<Integer, Integer>() ;stat…

复盘理解/实验报告梳理 数据结构PTA实验二

一、列车厢调度 感觉这道题的题干有点难以读懂&#xff0c;或是有些地方介绍的比较含蓄。 先设置两个字符串&#xff0c;来接收进道顺序与出道顺序&#xff0c;题目的内容和那个知道入栈顺序求出栈顺序比较像。 从头循环遍历&#xff0c;检查配对&#xff0c;不配对的就入栈&am…

如何禁止服务器自动休眠

如何禁止服务器自动休眠 有时候服务器自己休眠&#xff0c;导致系统web站点无法访问&#xff0c;下面是解决办法&#xff01; 禁止服务器自动进入休眠状态的具体方法可能会因使用的Linux发行版而有所不同。以下是一些通用的方法&#xff0c;你可以根据你的系统选择适用的&#…

python之画动态图 gif效果图

import pandas as pd import matplotlib import matplotlib.pyplot as plt import os# set up matplotlib is_ipython inline in matplotlib.get_backend() if is_ipython:from IPython import displayplt.ion()def find_csv_files(directory):csv_files [] # 用于存储找到的…

【机器学习】044_Kaggle房价预测(机器学习模型实战)

参考自《动手学深度学习》中“Kaggle比赛实战&#xff1a;预测房价”一节 一、数据准备 首先从网站上下载要获取的房价数据。 DATA_HUB是一个字典&#xff0c;用来将数据集名称的字符串和数据集相关的二元组一一对应。 二元组包含两个值&#xff1a;数据集的URL和用来验证文…

python实现最小二叉堆---最小堆结构

#来源于MOOC学习以及数据结构与算法分析# 在我们学习最小二叉堆代码实现之前&#xff0c;我们需要去了解一下&#xff0c;什么是最小二叉堆&#xff08;也有最大二叉堆&#xff0c;也叫最大堆&#xff09;。 也就是说什么是二叉堆&#xff1f;&#xff1f;&#xff1f;&#…

HiveSql语法优化三 :join优化

前面提到过&#xff1a;Hive拥有多种join算法&#xff0c;包括Common Join&#xff0c;Map Join&#xff0c;Bucket Map Join&#xff0c;Sort Merge Buckt Map Join等&#xff1b;每种join算法都有对应的优化方案。 Map Join 在优化阶段&#xff0c;如果能将Common Join优化为…

Excel中的INDIRECT函数用法

当在 Excel 中使用 INDIRECT 函数时&#xff0c;它可以帮助我们通过引用字符串中的单元格地址来获取对应单元格的值。这个函数非常有用&#xff0c;特别是在需要动态地引用其他单元格的情况下。下面是 INDIRECT 函数的一些用法和示例&#xff1a; 基本用法&#xff1a; INDIREC…

Linux 中的网站服务管理

目录 1.安装服务 2.启动服务 3.停止服务 4.重启服务 5.开机自启 6.案例 1.安装服务 网址服务程序 yum insatll httpd -y 查看所有服务 systemctl list-unit-files 2.启动服务 systemctl start httpd 查看服务进程&#xff0c;确认是否启动 ps -ef|grep httpd 3.停止…

python分析数据出现Text input context does not respond to _valueForTIProperty错误

一开始运行脚本还是不报错的&#xff0c;脚本内容部分如下&#xff1a; 出现了如下的效果图&#xff1a; 后面隔了几天再次运行居然报错了&#xff0c;如下图所示&#xff0c;但是也没有更改代码啊。后来发现原来是输入法导致的&#xff0c;把输入法切换成英文状态就不报错啦。…

【英/中,前端】Form <input> elements must have labels每一个元素应当都有一个标签

原文如下&#xff1a; Form elements must have labels | Axe Rules | Deque University | Deque Systems 编程式的关联标签和窗体控件。 下面以推荐程度从高到低依次排列&#xff0c;使用label元素->使用for和id属性显示关联&#xff0c;就这样。 label标签的包裹 or 不包…

linux下sys目录与proc目录的作用

sys目录作用 在Linux系统中&#xff0c;/sys目录是一个特殊的虚拟文件系统&#xff08;sysfs&#xff09;&#xff0c;用于提供对内核和设备的运行时信息的访问。它是在内核中运行的驱动程序和子系统的接口&#xff0c;可以用于获取和配置系统的硬件和内核信息。 以下是/sys目…

条件分布律

设是二维离散型随机变量&#xff0c;对于固定的&#xff0c;若&#xff0c;则称 &#xff0c; 其中 为在条件下随机变量的条件分布律。 对于固定的&#xff0c;若&#xff0c;则称 &#xff0c; 其中 为在条件下随机变量的条件分布律。

内网穿透工具,如何保障安全远程访问?

内网穿透工具是一种常见的技术手段&#xff0c;用于在没有公网IP的情况下将本地局域网服务映射至外网。这种工具的使用极大地方便了开发人员和网络管理员&#xff0c;使得他们能够快速建立起本地服务与外部网络之间的通信渠道。然而&#xff0c;在享受高效快捷的同时&#xff0…

C语言之函数设计(1)

目录 没有返回值的函数 通用性 不含形参的函数 函数返回值的初始化 作用域 文件作用域 声明和定义 函数原型声明 头文件和文件包含指令 在上节中我们简单的学习了函数的创建方法&#xff08;函数定义&#xff09;与函数的使用方法&#xff08;函数调用&#xff09;&…

特殊日期。

问题描述 对于一个日期&#xff0c;我们可以计算出年份的各个数位上的数字之和也可以分别计算月和日的各位数字之和。请问从1900年1月1日至9999年12月31日&#xff0c;总共有多少天&#xff0c;年份的数位数字之和等于月的数位数字之和加日的数位数字之和。 例如&#xff0c;20…

现代雷达车载应用——第2章 汽车雷达系统原理 2.2节 汽车雷达架构

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.2 汽车雷达架构 从顶层来看&#xff0c;基本的汽车雷达由发射器&#xff0c;接收器和天线组成。图2.2给出了一种简化的单通道连续波雷达结构[2]。这…

Doris集群搭建——2.0.1.1版本

目录 一、启动Doris 二、配置并分发doris安装包和环境变量 1.分发doris安装包 2.解压安装包 3.分发环境变量 4.修改对应的配置文件 (1)修改be的配置 (2)修改fe的配置 三、be的扩容与缩容 (一)be扩容 1.添加be节点 3.另外两个节点启动be 4.重新查看be节点状态 (二…

NPM的介绍及使用详解

NPM&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;它让开发者能够方便地在自己的项目中使用和分享代码。 NPM不仅提供了一个庞大的代码库&#xff0c;还提供了命令行界面&#xff0c;用于下载、安装、更新和管理代码包。 下面详细介绍NPM的介…

数据可视化?这些平台能处

图表在各行各业都起到举重若轻的作用&#xff0c;无论是项目汇报、业绩分析&#xff0c;亦或是数据挖掘、统计分析&#xff0c;良好的可视化可以为我们的阐述起到画龙点睛的效果。在一篇文章中&#xff0c;如果只有密密麻麻的文字堆积&#xff0c;无论是谁恐怕都无法长期保持注…