C语言库函数——快排函数qsort()

2023-11-17

目录

一、函数原型

二、函数介绍

三、函数使用

常见写法

比较函数

四、函数实例

1、int型数组

2、double型数组

3、char型数组

4、字符串

5、结构体

一级结构

二级结构


一、函数原型

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

二、函数介绍

qsort包含在<stdlib.h>头文件中,根据你给出的比较函数进行快速排序,通过指针移动实现排序,排序之后的结果仍然放在原数组中,使用qsort函数必须自己写一个比较函数。

注意:qsort()函数无返回值。

三、函数使用

常见写法:
(s、n、cmp均为样例名称,无特定含义,根据自己的定义改动即可)
void qsort(s, n, sizeof(s[0]), cmp);

函数参数个数:4

  • s:参与排序的数组名
  • n:参与排序的元素个数
  • sizeof(s[0]):计算单个数组空间的大小(括号里面的s[0]只是随便挑选的,用于计算,此处也可以是s[1]或者其他,但是不可越界,根据自己习惯定义即可)
  • cmp:比较函数(此部分需要自己完成)
比较函数:

函数模板:
注意:

  • 比较函数为自定义函数
  • 其两个参数为void*类型指针a和b,返回参数为整形int
  • 参数类型为void*原因:不清楚需比较元素的类型是什么,所以通过void*类型指针的特点(可以接收任意类型的地址)来接收。
  • const修饰其两个比较参数以防止其在使用时失误改动数据
int cmp(const void *a ,const void *b)  
{  
    return *(int *)a - *(int *)b ;  //从小到大排序,把a,b位置反过来就是从大到小   
}  

//或者

int cmp(const void *a ,const void *b)  
{  
    return *a - *b ;  //从小到大排序,把a,b位置反过来就是从大到小   
}  

四、函数实例

1、int型数组
#include <iostream>
using namespace std;

int cmp(const void *a, const void *b)
{
	return *(int *)a - *(int *)b;//升序
//	return *(int *)b - *(int *)a;//降序
}

int main()
{
    int n, s[10000];
    cin >> n;
    for (int i = 0; i < n; i++)
    {
       cin>>s[i];
    }
    qsort(s, n, sizeof(s[0]), cmp);
    for (int i = 0; i < n; i++)
    {
        cout << s[i]<<" ";
    }
    return 0;
}
2、double型数组
#include <iostream>
using namespace std;
int cmp(const void* a, const void* b) 
{
    return ((*(double*)a - *(double*)b) > 0 ? 1 : -1);//升序
    //	return ((*(double *)a - *(double *)b)<0?1:-1);//降序
}

int main()
{
    int n;
    double s[10000];
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> s[i];
    }
    qsort(s, n, sizeof(s[0]), cmp);
    for (int i = 0; i < n; i++)
    {
        cout << s[i] << " ";
    }
    return 0;
}

Tips:如果像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系。

3、char型数组
#include <iostream>
using namespace std;
int cmp(const void* a, const void* b)
{
    return *(char*)a - *(char*)b;//升序
    //	return *(char *)b - *(char *)a;//降序
}

int main()
{
    int n;
    char s[10000];
    cin>>n;
    getchar();  //防止将换行操作误读取
    for (int i = 0; i < n; i++)
    {
        cin >> s[i];
    }
    qsort(s, n, sizeof(s[0]), cmp);
    for (int i = 0; i < n; i++)
    {
        cout << s[i] << " ";
    }
    return 0;
}
4、字符串
#include <iostream>
using namespace std;
int cmp(const void* a, const void* b)
{
    return strcmp((char*)a, (char*)b);//升序
    //	return strcmp((char *)b, (char *)a);//降序
}

int main()
{
    int n;
    char s[1000][1000];
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> s[i];
    }
    qsort(s, n, sizeof(s[0]), cmp);
    for (int i = 0; i < n; i++)
    {
        cout << s[i] << endl;
    }
    return 0;
}
5、结构体
  • 一级结构
#include <iostream>
using namespace std;
struct node 
{
    int id;
}s[100];

int cmp(const void* a, const void* b) 
{
    struct node* aa = (node*)a;
    struct node* bb = (node*)b;
    return ((aa->id) > (bb->id)) ? 1 : -1;//升序
    //	return ((aa->id)>(bb->id))?-1:1;//降序
}

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> s[i].id;
    }
    qsort(s, n, sizeof(s[0]), cmp);
    for (int i = 0; i < n; i++)
    {
        cout << s[i].id << endl;
    }
    return 0;
}
  • 二级结构
#include <iostream>
using namespace std;
struct node 
{
    int id;
    char data;
}s[100];

int cmp(const void* a, const void* b)
{
    struct node* aa = (node*)a;
    struct node* bb = (node*)b;
    if (aa->id == bb->id)//若id相同,按照data排序
    {
        return aa->data - bb->data;//升序
    }
    else//否则按照id排序 
    {
        return aa->id - bb->id;//升序
    }
}

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> s[i].id >> s[i].data;
    }
    qsort(s, n, sizeof(s[0]), cmp);
    for (int i = 0; i < n; i++)
    {
        cout << s[i].id << s[i].data << endl;
    }
    return 0;
}

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

C语言库函数——快排函数qsort() 的相关文章

随机推荐

  • 基于Matlab的随机森林算法实现(附算法介绍及代码详解)

    本算例完整代码领取方式在文末展示 一 内容提要 在地学领域中 岩性的准确识别对于储层评价来说至关重要 因此 今天笔者想要分享的是随机森林算法在岩性识别中的应用与代码实现 科普中国 科学百科定义 随机森林 Random forest 指的是利
  • 一文学会目前最火热的大数据技术

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由michelmu发表于云 社区专栏 Elasticsearch是当前主流的分布式大数据存储和搜索引擎 可以为用户提供强大的全文本检索能力 广泛应用于日志检索 全站搜索等领域 L
  • C程序运行步骤

    1 首先输入和编辑源程序 生成 c文件 2 对源程序进行编译 编译的作用首先是对源程序进行检查 判定他有无语法方面的错误 生成 obj文件 3 然后进行连接处理 把编译后的模块连接装配起来 再与函数库 例如scanf printf 连接成一
  • Web开发权威指南笔记(一)

    书 Web开发权威指南 美 Chris Aquino Todd Gandee著 为1st实战项目Ottergram练习以及代码整理 全为个人借鉴本书产出 若需要转载请联系通知我 谢谢 最终成果展示 第一章 配置开发环境 文档与参考资料 De
  • 手把手教你从零开发到上线一个答题微信小程序项目实战教程之01.开发环境搭建,微信小程序helloworld

    上线项目演示 微信搜索 放马来答 或扫以下二维码体验 项目大纲 1 开发环境搭建 微信小程序helloworld 2 题目分类页 3 答题页mock数据 4 答题页请求真实数据 pay 5 答题页记录错题 6 结果得分页 pay 7 展示错
  • springmvc url地址配置

    springmvc url地址配置 RequestMapping 注解的概念 通过 RequestMapping将请求地址与方法进行绑定 可以在类级别和方法级别声明 类级别的注解负责将一个特定的请求路径映射到一个控制器上 将url和类绑定
  • django-admin.py startproject HelloWorld创建文件提示invalid syntax

    直接用win R 输入cmd 输入python 然后输入django admin py startproject HelloWorld创建文件提示invalid syntax 解决方法 直接在cmd下执行语句 即可生成Helloworld项
  • MybatisPlus入门和分页和条件查询里面的条件和null值的处理方式和查询投影和查询条件设置和id生成相关和逻辑删除

    MybatisPlus 简化了mybatis之前的在springboot整合MyBatis时需要自己写sql语句在接口中 现在只需要让接口继承BaseMapper lt 实体类 gt 然后在测试类中接口 增删改查方法 即可 不用像sprin
  • MMEditing代码阅读笔记一:main()函数中的build_model()

    MMEditing代码阅读笔记一 main 函数中的build model 小白一枚 编程功底很弱 接触MMEditing这套代码 刚开始小眉头一皱 鼠标见点来点去不知道咋个回事 网上又没有关于MMEditing代码阅读的相关阐述 眉头更皱
  • LEFT JOIN右表为空也查出数据

    SELECT A B type FROM Table A A LEFT JOIN Table B B ON A id B id WHERE B type 1 改为 SELECT A B type FROM Table A A LEFT JO
  • 在WinForm中屏蔽中文输入法

    在WinForm的开发中 有时有些特殊的要求 例如 在某个Form上彻底屏蔽中文输入法 使之不能切换到中文输入 不能进行中文输入 这个问题看上去简单 实现起来并没有想象中的简单 下面 把我做的几个实验依次列举 就会发现 其实实现起来还是有一
  • websocket菜鸟教程(1.1)

    创建自己的websocket服务 先了解node js websocket 的基本使用https www npmjs com package nodejs websocket 第一步先安装 npm install nodejs websoc
  • mysql5.6安装步骤详细_详解MySQL5.6安装步骤

    是开放源码的小型关系型数据库管理系统 目前MySQL被广泛应用于在Internet上的中小型网站中 但是对于刚接触MySQL数据库服务器的朋友来说 是非常陌生的 那么现在爱站小编为大家详解MySQL5 6步骤 1 点击下载好的安装文件 出现
  • console控制台错误及处理过程

    1 ERROR Failed to execute goal org apache maven plugins maven compiler plugin 2 5 1 compile default compile on project l
  • 为什么组件中的data是一个函数而不是一个对象?

    JS中的对象是引用类型的数据 当多个实例引用同一个对象时 只要有一个实例对这个对象进行操作 其他实例中的数据也会发生变化 而在vue中 更想要每个组件都有自己的数据 不会互相干扰 所以组件的数据不能写成对象的形式而要是函数的形式 数据以函数
  • Ubuntu下非常给力的下载工具

    Windows下的下载工具 迅雷 之所以下载速度快 乃是它能搜索资源 为己所用 而不是仅仅从原始地址这单一资源处下载 Ubuntu下也有类似的工具 那就是aira2 aira2是一个命令行下载工具 可以配合其他图形界面的下载软件使用 我用的
  • HyperLogLog数据结构

    基数计数 cardinality counting 通常用来统计一个集合中不重复的元素个数 例如统计某个网站的UV 或者用户搜索网站的关键词数量 数据分析 网络监控及数据库优化等领域都会涉及到基数计数的需求 要实现基数计数 最简单的做法是记
  • python读取csmar_如何优雅的把CSMAR(国泰安)数据导入R

    前言CSMAR 国泰安 数据库是经济金融相关的科研工作者用到的最多的数据库之一 它提供了丰富全面的上市公司财务及金融数据 以及一些行业宏观层面的数据 但是 它并没有像WRDS 沃顿研究数据服务 等数据库提供丰富接口 如SAS R等 供下载
  • 论文阅读笔记之——《Multi-level Wavelet-CNN for Image Restoration》及基于pytorch的复现

    本博文是MWCNN的阅读笔记 论文的链接 https arxiv org pdf 1805 07071 pdf 代码 https github com lpj0 MWCNN 仅仅是matlab代码 通过参考代码 对该网络在pytorch框架
  • C语言库函数——快排函数qsort()

    目录 一 函数原型 二 函数介绍 三 函数使用 常见写法 比较函数 四 函数实例 1 int型数组 2 double型数组 3 char型数组 4 字符串 5 结构体 一级结构 二级结构 一 函数原型 void qsort void bas