【C语言】详讲qsort库函数

news2024/12/26 23:07:09

qsort函数介绍

  1. 具体作用

qsort函数是一种用于对不同类型数据进行快速排序的函数,排序算法有很多

最常用的冒泡排序法仅仅只能对整形进行排序,qsort不同,排序类型不受限制,

qsort函数的底层原理是一种快速排序.


  1. 基本构造

qsort( void* arr, int sz, int sizeof, cmp_code);

void* arr:任意类型数组的第一个首元素

int sz:数组的总元素个数

int sizeof:该数组类型字节数

cmp_code:用于交换的函数,其函数需要用户自行定义,标准为:

int cmp_code(const void * p1,const void * p2)

形参1为要交换的元素,形参2为要交换的元素的后一个元素

当返回值大于0,则表示p1>p2

当返回值小于0,则表示p1<p2

当返回值等于0,则表示p1=p2


3.使用方法

//qsort使用练习
//对整形进行排序
int My_code(const void* p1, const void* p2)
{
    return *((int*)p1) - *((int*)p2);
}
int main()
{
    int arr[5] = { 2,1,4,6,3 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr,sz,sizeof(arr[0]),My_code);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}


//对字符型排序
int My_code(const void* p1, const void* p2)
{
    return strcmp((char *)p1,(char *) p2);
}
int main()
{
    char arr[] = "badcf";
    int sz = strlen(arr);
    qsort(arr, sz, sizeof(arr[0]), My_code);
    puts(arr);
    return 0;
}


//对结构体排序
//对年龄进行排序(升序)
struct Stu
{
    int age;
    char name[20];


};
int My_code(const void* p1, const void* p2)
{
    return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}
int main()
{
    struct Stu p[] = { {20,"zhangsan"},{19,"lisi"},{21,"wangwu"}};
    int sz = sizeof(p) / sizeof(p[0]);
    qsort(p, sz, sizeof(p[0]), My_code);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", (p+i)->age);
    }
    return 0;
}


//对名字进行排序(升序)
struct Stu
{
    int age;
    char name[20];


};
int My_code(const void* p1, const void* p2)
{
    return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}
int main()
{
    struct Stu p[] = { {20,"zhangsan"},{19,"lisi"},{21,"wangwu"} };
    int sz = sizeof(p) / sizeof(p[0]);
    qsort(p, sz, sizeof(p[0]), My_code);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%s ", (p + i)->name);
    }
    return 0;
}


4.使用qsort模拟实现冒泡排序算法

//我们先实现一个冒泡排序
void Code_one(int* arr, int sz)
{
    //冒泡排序为两两比较,因此进行一轮比较得出一个元素
    //一轮需比较sz-1-得出的元素次,总共需要sz-1轮
    int i = 0;
    int j = 0;
    for (i = 0; i < sz - 1; i++)
    {
        for (j = 0; j < sz - 1 - i; j++)
        {
            int tmp = 0;
            //两两比较,进行交换
            if (arr[j] > arr[j + 1])
            {
                tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
}
int main()
{
    //定义整形数组
    //排升序
    int arr[] = { 2,3,1,5,6,8,9 };
    //计算元素个数
    int sz = sizeof(arr) / sizeof(arr[0]);
    //分装一个函数实现冒泡排序
    Code_one(arr, sz);
    return 0;
}
//qsort模拟实现冒泡排序(可排任意类型)
int cmp(const void* p1,const void* p2)
{
    return (*(int*)p1) - (*(int*)p2);
}
void Smin(const void* p1,const void* p2, int cont)
{
    int i = 0;
    char tmp = 0;
    //利用循环,我们将要交换的元素内存依次交换
    //因为是强转为char类型,我们也有字节大小,我们只需将每一个字节交换即可
    for (i = 0; i < cont; i++)
    {
        tmp = *((char*)p1 + i);
        *((char*)p1+i) = *((char*)p2 + i);
        *((char*)p2 + i) = tmp;
    }
}
void Sqort_code(void* arr, int sz, int cont, int (*m)(const void*,const void*))
{
    int i = 0;
    int j = 0;
    //总趟数
    for (i = 0; i < sz - 1; i++)
    {
        //一趟冒泡排序
        for (j = 0; j < sz - 1 - i; j++)
        {
            //在冒泡排序中,判断条件为arr[j]>arr[j+1]
            //而现在我们想排任意类型的数据时,我们可以调用m函数,
            //利用qsort性质,大于返回>0,小于返回<0,等于返回=0
            //而m函数参数我们可以强制转换为char*类型+j*cont(类型字节数)
            //因为char类型为1字节,char指针+(j*cont(类型字节数))也就等于
            //任意类型指针+j的表示方法,这种表示方法利于我们排列不同的类型
            if (m((char*)arr + j * cont, (char*)arr + (j + 1) * cont)>0)
            {
                //交换,分装Smin函数用于交换,形参将要交换的元素地址和元素类型字节传过去
                Smin((char*)arr + j * cont, (char*)arr + (j + 1)* cont, cont);
            }
        }
    }
}
int main()
{
    //假设要将整形数组排成升序
    int arr[] = { 2,3,1,4,7,6,9,8 };
    //分装一个函数,模拟实现qsort
    Sqort_code(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), cmp);
    int i = 0;
    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

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

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

相关文章

【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)

简介 五子棋作为一个棋类竞技运动&#xff0c;在民间十分流行&#xff0c;为了熟悉五子棋规则及技巧&#xff0c;以及研究简单的人工智能&#xff0c;决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用&#xff0c;客户端…

IP协议+以太网协议

在计算机网络体系结构的五层协议中&#xff0c;第三层就是负责建立网络连接&#xff0c;同时为上层提供服务的一层&#xff0c;网络层协议主要负责两件事&#xff1a;即地址管理和路由选择&#xff0c;下面就网络层的重点协议做简单介绍~~ IP协议 网际协议IP是TCP/IP体系中两…

20230310英语学习

Some Narcissists Chase Status, Others Want to Win Admiration 自恋并非自尊心膨胀&#xff0c;那它因何而来&#xff1f; Narcissists often rub their friends and family the wrong way by bragging about their exploits, seemingly a symptom of an overinflated sense …

什么是AIGC?

目录前言一、什么是AIGC&#xff1f;1、什么是PGC&#xff1f;2、什么是UGC&#xff1f;3、什么是PUCG&#xff1f;4、什么是AIGC&#xff1f;二、总结前言 很明显&#xff0c;ChatGPT的爆火&#xff0c;带动了AIGC&#xff08;AI-Generated Content&#xff09;概念的火热。 …

DP算法:动态规划算法

步骤&#xff08;1&#xff09;确定初始状态&#xff08;2&#xff09;确定转移矩阵&#xff0c;得到每个阶段的状态&#xff0c;由上一阶段推到出来&#xff08;3&#xff09;确定边界条件。例题蓝桥杯——印章&#xff08;python实现&#xff09;使用dp记录状态&#xff0c;d…

为 Argo CD 应用程序指定多个来源

在 Argo CD 2.6 中引入多源功能之前,Argo CD 仅限于管理来自 单个 Git 或 Helm 存储库 的应用程序。用户必须将每个应用程序作为 Argo CD 中的单个实体进行管理,即使资源存储在多个存储库中也是如此。借助多源功能,现在可以创建一个 Argo CD 应用程序,指定存储在多个存储库…

ADS中导入SPICE模型

这里写目录标题在官网中下载SPICE模型ADS中导入SPICE模型在官网中下载SPICE模型 英飞凌官网 ADS中导入SPICE模型 点击option&#xff0c;设置导入选项 然后点击ok 如果destination选择当前的workspace&#xff0c;那么导入完成之后如下&#xff1a; &#xff08;推荐使用…

API 网关日志的价值,你了解多少?

本文介绍了 API 网关日志的价值&#xff0c;并以知名网关 Apache APISIX 为例&#xff0c;展示如何集成 API 网关日志。 作者钱勇&#xff0c;API7.ai 技术工程师&#xff0c;Apache APISIX Committer。 原文链接 网关日志的价值 在数字化时代&#xff0c;软件架构随着业务成…

单例模式之懒汉式

在上篇文章中&#xff0c;我们讲了单例模式中的饿汉式&#xff0c;今天接着来讲懒汉式。 1.懒汉式单例模式的实现 public class LazySingleton {private static LazySingleton instance null;// 让构造函数为private&#xff0c;这样该类就不会被实例化private LazySingleto…

unicode字符集与utf-8编码的区别,unicode转中文工具、中文转unicode工具(汉字)

在cw上报的报警信息中&#xff0c;有一个name字段的值是\u4eba\u4f53 不知道是啥&#xff0c;查了一下&#xff0c;是unicode编码&#xff0c;用下面工具转换成汉字就是“人体” 参考文章&#xff1a;https://tool.chinaz.com/tools/unicode.aspx 那么我很好奇&#xff0c;uni…

Web3中文|无聊猿Otherside元宇宙启动第二次旅行

3月9日消息&#xff0c;无聊猿Bored Ape Yacht Club母公司Yuga Labs公布了其Otherside元宇宙游戏平台第二次测试的最新细节。Yuga Labs公司称&#xff0c;“第二次旅行”将于3月25日举行&#xff0c;由四位Otherside团队长带领完成近两小时的游戏故事。本次旅行对Otherdeed NFT…

JavaScript String 字符串对象实例合集

文章目录JavaScript String 字符串对象实例合集返回字符串的长度为字符串添加样式返回字符串中指定文本首次出现的位置 - indexOf()方法查找字符串中特定的字符&#xff0c;若找到&#xff0c;则返回该字符 - match() 方法替换字符串中的字符 - replace()JavaScript String 字符…

1/4车、1/2车、整车悬架PID控制仿真合集

目录 前言 1. 1/4悬架系统 1.1数学模型 1.2仿真分析 2. 1/2悬架系统 2.1数学模型 2.2仿真模型 2.3仿真分析 3. 整车悬架系统 3.1数学模型 3.2仿真分析 参考文献 前言 前面几篇文章介绍了LQR、SkyHook、H2/H∞控制&#xff0c;接下来会继续介绍滑模、反步法、MPC、…

Web漏洞-SSRF漏洞(详细)

SSRF漏洞介绍&#xff1a;SSRF(Server-Side Request Forgery&#xff09;&#xff1a;服务器端请求伪造&#xff0c;该漏洞通常由攻击者构造的请求传递给服务端&#xff0c;服务器端对传回的请求未作特殊处理直接执行而造成的。一般情况下&#xff0c;SSRF攻击的目标是从外网无…

AidLux AI应用案例悬赏选题 | 纺织品表面瑕疵检测

AidLux AI 应用案例悬赏征集活动 AidLux AI 应用案例悬赏征集活动是AidLux推出的AI应用案例项目合作模式&#xff0c;悬赏选题将会持续更新。目前上新的选题涉及泛边缘、机器人、工业检测、车载等领域&#xff0c;内容涵盖智慧零售、智慧社区、智慧交通、智慧农业、智能家居等…

荧光染料IR-825 NHS,IR825 NHS ester,IR825 SE,IR-825 活性酯

IR825 NHS理论分析&#xff1a;中文名&#xff1a;新吲哚菁绿-琥珀酰亚胺酯&#xff0c;IR-825 琥珀酰亚胺酯&#xff0c;IR-825 活性酯英文名&#xff1a;IR825 NHS&#xff0c;IR-825 NHS&#xff0c;IR825 NHS ester&#xff0c;IR825 SECAS号&#xff1a;N/AIR825 NHS产品详…

JavaScript 高级实例集合

文章目录JavaScript 高级实例集合创建一个欢迎 cookie简单的计时另一个简单的计时在一个无穷循环中的计时事件带有停止按钮的无穷循环中的计时事件使用计时事件制作的钟表创建对象的实例创建用于对象的模板JavaScript 高级实例集合 创建一个欢迎 cookie 源码 <!DOCTYPE ht…

Spring源码阅读(基础)

第一章&#xff1a;bean的元数据 1.bean的注入方式&#xff1a; 1.1 xml文件 1.2 注解 Component&#xff08;自己写的类才能在上面加这些注解&#xff09; 1.3配置类&#xff1a; Configuration 注入第三方数据源之类 1.4 import注解 &#xff08;引用了Myselector类下…

1/4车、1/2车、整车悬架模糊PID控制仿真合集

目录 前言 1. 1/4悬架系统 1.1数学模型 1.2仿真分析 2. 1/2悬架系统 2.1数学模型 2.2仿真模型 2.3仿真分析 3. 整车悬架系统 3.1数学模型 3.2仿真分析 4.总结 前言 前面几篇文章介绍了LQR、SkyHook、H2/H∞、PID控制&#xff0c;接下来会继续介绍滑模、反步法、M…

个性化营销:您需要知道的信息

个性化营销在现代企业中风靡一时。我们将剖析您需要了解的有关个性化营销的信息&#xff0c;一起来了解一下吧。 什么是个性化营销&#xff1f; 个性化营销是一种一对一营销形式&#xff0c;它使用实时用户数据和分析来传递品牌信息并针对特定潜在客户。 它与传统营销不同&…