qsort函数

目录

1.qsort函数是什么 

1.1qsort函数的原型

2.qsort函数的使用

2.1使用qsort函数排序整型数据

2.2使用qsort排序结构数据

3.qsort函数的模拟实现


1.qsort函数是什么 

        很多小伙伴们都没有听说过qsort这个函数,qsort函数是C语言标准库中的一个排序函数,那么我们在使用它的时候就要在代码前包含它的头文件<stdlib.h>。它的底层逻辑快速排序算法。快速排序是一种高效的排序算法,其平均和最坏情况下的时间复杂度分别为O(n log n)和O(n^2),但通过合理的选取中间元素作为基准(pivot),可以使得最坏情况的发生概率大大降低。它的功能其实就是将各种数据来排序。

1.1qsort函数的原型

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

这个很长很长的代码其实就是它的原型了,那这些传给它的参数都是什么呢?

  • base:指向要排序的数组的第一个元素的指针。
  • nmems:由 base 指向的数组中元素的个数。
  • size:数组中每个元素的大小(以字节为单位)。
  • compar:一个比较函数,用来比较两个元素的大小。这个函数需要返回一个负数、零或正数,分别表示第一个参数小于、等于或大于第二个参数。

由于函数的声明是void类型,所以它不会返回任何值。

比较函数compar的原型通常为:

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

比较函数的返回类型是int,那它应该返回什么值呢?

根据qsort函数接收的参数规则来讲,p1大于p2返回一个大于0的数字,等于则返回0,小于则返回-1,在vs的编译环境下,大于0的数通常被用1来代替。

2.qsort函数的使用

       使用qsort函数时,需要注意以下几点:
  1.base必须是void*类型的指针,这意味着qsort可以排序任何类型的数组,只要该类型能够转换为void*。
  2.nmemb和size必须是指向数组大小和元素大小的有效指针。
  3.compar函数必须是按照元素类型定义的正确比较函数。
        qsort函数的使用非常灵活,它可以排序基本数据类型的数组,如整数、浮点数等;也可以排序复杂数据类型的数组,如结构体数组;甚至可以排序字符串数组。

2.1使用qsort函数排序整型数据

#include<stdio.h>
#include<stdlib.h>

void print_arr(int arr[], int sz)
{
	int i = 0;
	for (; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int comar_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;  
}
void test()
{
	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), comar_int);
	print_arr(arr, sz);
	printf("\n");

}
int main ()
{
    test();
    return 0;
}

结果为:

这里就完成了对整型数组arr的从小到大的排序。可qsort函数的能力可远不及此。

2.2使用qsort排序结构数据
 

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
struct Stu
{
	char name[20];
	int age;
};
int cmp_sty_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
//使用了strcmp库函数根据ASCII码值来比较
}
int cmp_sty_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

void test2()
{
	struct Stu arr[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
	int sz = (sizeof(arr) / sizeof(arr[0]));
	qsort(arr, sz, sizeof(arr[0]), cmp_sty_by_name);
	for (int i = 0; i < sz; i++)
	{
		printf("%s ", arr[i].name);
	}
	printf("\n");
}
void test3()
{
	struct Stu arr[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
	int sz = (sizeof(arr) / sizeof(arr[0]));
	qsort(arr, sz, sizeof(arr[0]), cmp_sty_by_age);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i].age);
	}
}
int main()
{
	//test();
	test2();
	test3();
	return 0;
}

结果为:

3.qsort函数的模拟实现

        对于快速排序的算法我们可能不是很清楚,但是总学过冒泡排序吧,接下来让我们来用冒泡排模拟实现我们自己的qsort函数。

结果为:

如果对你有帮助的话,就动动小手点个赞叭!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端精准测试调用链路分析

精准测试在评估需求的测试范围时&#xff0c;需要评估一下代码的影响范围&#xff0c;这个范围有两部分&#xff1a;一是需求直接修改的代码&#xff1b;二是修改代码影响到的功能模块。代码影响到的功能一般是通过调用链路分析来实现的&#xff0c;java和kotlin代码可以由java…

【Java从入门到精通】Java异常处理

异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的。 比如说&#xff0c;你的代码少了一个分号&#xff0c;那么运行出来结果是提示是错误 java.lang.Error&#xff1b;如果你用System.out.println(11/0)&#xff0c;那么…

每日OJ题_路径dp②_力扣63. 不同路径 II

目录 力扣63. 不同路径 II 解析代码 力扣63. 不同路径 II 63. 不同路径 II 难度 中等 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;…

week06 day04 (数据库高级函数 procedure 、sql写函数)

一. ER模型 矩形&#xff1a; 代表实体椭圆&#xff1a;代表实体的属性菱形&#xff1a;relation 代表实体之间的关系 二. 存储过程&#xff08;procedure&#xff09; 1. 语法 语法: create procedure 存储过程名(参数,…) begin//代码 end// 注意&#xff1a; 因为在存储…

C语言 —— 图形打印

题目1&#xff1a; 思路&#xff1a; 如果我们要打印一个实心正方形&#xff0c;其实就是一个二维数组&#xff0c;i控制行&#xff0c;j控制列&#xff0c;行列不需要控制&#xff0c;arr[i][j]直接打印星号即可。 对于空心正方形&#xff0c;我们只需要控制行和列的条件&…

MyBatis学习笔记|2024最新版Mybatis

Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于“internet”和“aba…

应对电子邮件危害:垃圾邮件的特征、影响和预防策略

垃圾邮件是一种侵入性的未经请求的电子通信形式&#xff0c;主要通过电子邮件传播。它将大量无关、欺骗性或恶意内容发送给邮箱用户&#xff0c;内容涵盖令人讨厌的广告和欺诈行为、以及网络钓鱼链接。 截至 2022 年 12 月&#xff0c;垃圾邮件占电子邮件流量的 45% 以上。除了…

数据结构---C语言栈队列

知识点&#xff1a; 栈&#xff1a; 只允许在一端进行插入或删除操作的线性表&#xff0c;先进后出LIFO 类似一摞书&#xff0c;按顺序拿&#xff0c;先放的书只能最后拿&#xff1b; 顺序栈&#xff1a;栈的顺序存储 typedef struct{Elemtype data[50];int top; }SqStack; SqS…

Window部署Oracle并实现公网环境远程访问本地数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

掌握Redis,看完这篇文章就够了!

目录 1.Redis介绍 2.Redis服务器与客户端 3.Redis配置文件 4.Redis数据类型操作 4.1使用python连接数据库 4.2 字符串 4.3 哈希 4.4 键对应操作 4.5 列表 4.6 集合 4.7 有序集合 1.Redis介绍 Redis 是一个开源的内存数据库&#xff0c;它提供了一个高性能的 key-val…

基于PyTorch深度学习实战入门系列-Numpy基础全

Numpy的使用 导入Numpy模块 import numpy as np创建数组&#xff08;一维数组、小数数组、二维数组&#xff09; # 创建一个一维数组 n1 np.array([1, 2, 3]) # 创建一个含有小数的一维数组 n2 np.array([0.1, 0.2, 0.3]) # 创建一个简单的二维数组 n3 np.array([[1, 2], [3…

基于Java+SpringBoot+vue+element实现前后端分离牙科诊所管理系统详细设计

基于JavaSpringBootvueelement实现前后端分离牙科诊所管理系统详细设计 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 ** 作者主页 央顺技术团队** 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

【阿里云系列】-基于云效构建部署NodeJS项目到ACK

准备工作 01、编写Dockerfile文件可以根据不同的环境&#xff0c;新建不同的Dockerfile文件&#xff0c;比如Dockerfile-PROD # Deliver the dist folder with NginxFROM nginx:stable-alpine ENV LANGC.UTF-8 ENV TZAsia/ShanghaiCOPY dist/ /usr/share/nginx/html COPY ngi…

字节跳动也启动春季校园招聘了(含二面算法原题)

字节跳动 - 春招启动 随着各个大厂陆续打响春招的响头炮&#xff0c;字节跳动也官宣了春季校园招聘的正式开始。 还是那句话&#xff1a;连互联网大厂启动校招计划尚且争先恐后&#xff0c;你还有什么理由不马上行动&#xff1f;&#xff01; 先来扫一眼「春招流程」和「面向群…

怎么恢复删除的文件?三个实用数据恢复方法分享

在日常工作和生活中&#xff0c;我们经常会遇到误删文件的情况&#xff0c;这可能会带来不小的麻烦。幸运的是&#xff0c;随着科技的发展&#xff0c;现在有很多方法可以帮助我们恢复被删除的文件。下面让我来分享三种常用的文件恢复方法&#xff0c;一起来看看吧&#xff01;…

【Springboot】--如何将springboot+vue项目部署到云服务器?

目录 一、准备工作 1、购买云服务器 2、获取面板地址 二、jdk和数据库 1、安装环境 2、配置jdk环境变量 3、java版本的问题 4、添加数据库 三、前端部署 1、vue 2、创建站点 ​编辑 四、后端部署 1、application.yml 2、idea打包 3、运行jar包 4、开放端口 五、…

大模型时代下的 BI——智能问数

「智能问数」是 Sugar BI 基于文心大语言模型推出的对话式数据问答产品&#xff0c;让用户能够通过自然语言的方式进行对答形式的数据查询&#xff0c;系统自动使用可视化图表的方式呈现数据结果&#xff0c;并支持对数据做summary总结。 智能问数功能邀测中&#xff0c;欢迎CS…

Dgraph 入门教程四《开发环境的搭建》

在深入 了解Dgraph 之前&#xff0c;我们先了解下开发环境&#xff0c;毕竟让开发人员真正动起手来才是第一步。 Dgraph 支持很多种语言的开发&#xff0c;包括GO&#xff0c;Python&#xff0c;JS&#xff0c;C#和Java等等。出于项目需要&#xff0c;只了解下JS和Java。 1、…

基础小白快速入门web前端开发技术------->hbuilder的下载安装以及简易的网页最开始制作

工欲善其事&#xff0c;必先利其器&#xff0c; 在我们学习开发网页设计&#xff0c;我们首先需要一个良好的开发工具 这里我比较推荐hbuilder这个 只需要进入官网傻瓜下载&#xff0c;傻瓜安装 https://dcloud.io/ 点击hbuilder选择版本进行下载安装即可 hbuilder的新建文件…

深度强化学习(四)SARSA

深度强化学习&#xff08;四&#xff09;SARSA算法 一.SARSA 假设状态空间 S \mathcal{S} S 和动作空间 A \mathcal{A} A 都是有限集, 即集合中元素数量有限。比如, S \mathcal{S} S 中一共有 3 种状态, A \mathcal{A} A 中一共有 4 种动作。那么动作价值函数 Q π ( s …