当前位置: 首页 > news >正文

qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数

个人主页:点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

1.qsort函数

1.1qsort函数的参数

1.2利用qsort函数排序整形数据

1.3利用qsort函数排序结构体数据

2.模拟实现qsort函数

2.1冒泡排序

2.2代码实现


         今天主要给大家带来的是对于qsort函数的详细讲解以及使用冒泡排序模拟实现qsort函数,我们这里包括qsort函数的参数的理解和使用针对数组结构体进行升序降序排序,模拟qsort函数的参数。

1.qsort函数

1.1qsort函数的参数

        对于qsort函数,我相信大家大部分还是第一次见到这个函数,我们先进入网站cplusplus

 返回旧版,查找qsort函数

 我们看到qsort函数的头文件是stdlib.h,我们可以发现qsort函数具定义为

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

 

        在这里base是指我们要传入的数组 ,num是指传入数组的元素个数,size是指数组一个元素的所占的字节数,int (*compar)(const void*,const void*)是一个函数指针,在这里需要我们建立一个函数

         这个函数指针的参数是void*类型,因为qsort函数可以排序任意类型的数据,使用时强制转换就可以使用。

1.2利用qsort函数排序整形数据

#include<stdio.h>
#include <stdlib.h>
int comper(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}
int main()
{int arr[5] = { 0,2,1,4,3 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), comper);int i;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}

我们运行后可以得到

为升序排序,我们想要改为降序排序只需要将我们的comper函数进行修改

int comper(const void* e1, const void* e2)
{return  *(int*)e2- *(int*)e1 ;
}

运行后为降序排序。

1.3利用qsort函数排序结构体数据

#include<stdio.h>
#include <stdlib.h>
typedef struct student
{int age;char num[20];
}stu;
int comper(const void* e1, const void* e2)
{return ((stu*)e1)->age - ((stu*)e2)->age;
}
int main()
{stu arr[3] = { 20,"zhangsan",19,"libai",22,"aiqiyi" };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), comper);int i;for (i = 0; i < sz; i++){printf("%d ", arr[i].age );}return 0;
}

在进行比较名字是我们需要用到strcmp函数具体代码如下

int comper(const void* e1, const void* e2)
{return strcmp(((stu*)e1)->num , ((stu*)e2)->num);
}

2.模拟实现qsort函数

        我们前面讲过想对数据进行排序可以使用冒泡排序,但是冒泡排序却有一些局限性,我们在这里利用冒泡排序来模拟实现qsort函数。

2.1冒泡排序

  对于冒泡排序我们主要的代码为

void bulubulu(int arr[],int sz)
{int i, j,temp;for (i = 0; i < sz - 1; i++){for (j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

在这里我们主要就是依靠冒泡排序进行实现。

2.2代码实现

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
int comper(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}
void swap(char *p,char*q,size_t sz)
{int i;char temp;for (i = 0; i < sz; i++){temp = *p;*p = *q;*q = temp;p++;q++;}
}
void bulubulu(void *base,size_t sz,size_t size)
{int i, j;for (i = 0; i < sz - 1; i++){for (j = 0; j < sz - 1 - i; j++){if (comper((char*)base + j * size, (char*)base + (j + 1) * size)>0){swap((char*)base+j*size,(char*)base+(j+1)*size,sz);}}}
}void my_qsort(void *base,size_t num,size_t size,int(*comper)(const void *e1,const void *e2))
{bulubulu(base, num, size);
}
int main()
{int arr[5] = { 0,2,1,5,3 };int sz = sizeof(arr) / sizeof(arr[0]);my_qsort(arr, sz, sizeof(arr[0]), comper);int i;for (i = 0; i < sz; i++)printf("%d ", arr[i]);}

        在这里,我们想排序一个整型数组,我们先得到数组有几个元素,每个元素占用几个字节,在我怕们的my_qsort函数中采用void*base是因为我们不知道要排序的元素是什么类型,我们进入冒泡排序也就是bulubulu函数中,在这里最为关键的是if (comper((char*)base + j * size, (char*)base + (j + 1) * size)>0)和swap((char*)base+j*size,(char*)base+(j+1)*size,sz)这两句,由于我们不知道想要排序的是什么类型,base是void*类型,想要使用swap函数和comper函数需要我们传送地址,我们将base强制转换为char*类型,我们还有一个元素占用的字节数size,再根据是第几个元素得到它的地址,在swap中我们是一个字节一个字节的进行交换。在这里comper是我们用户自己写的,其余的只需要my_qsort就可以解决。

今天的内容就结束了,希望大家可以学到很多东西。

相关文章:

qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.qsort函数 1.1qsort函数的参数 …...

C++QT day6

1> 将之前定义的栈类和队列类都实现成模板类 栈&#xff1a; #include <iostream> #define MAX 128 using namespace std; template<typename T> class Stack_s { private:T *pnew T[MAX];//栈的数组int top;//记录栈顶的变量 public://构造函数Stack_s(int t…...

List与ArrayList

目录 一、List及其使用 1.1 List的概念 1.2 常见接口的介绍 1.3 List的使用 二、线性表和顺序表 2.1 线性表 2.2 顺序表 三、ArrayList介绍 四、ArrayList的使用 4.1 ArrayList构造 4.2 ArrayList的常用方法 4.3 ArrayList的遍历 4.4 ArrayList的扩容机制 五、ArrayList的具…...

【C++】特殊类的设计

文章目录 1. 设计一个类, 不能被拷贝2. 设计一个类, 不能被继承3. 设计一个类, 只能在堆上创建对象3. 设计一个类, 只能在栈上创建对象4. 创建一个类, 只能创建一个对象(单例模式)饿汉模式懒汉模式 1. 设计一个类, 不能被拷贝 &#x1f495; C98方式&#xff1a; 在C11之前&a…...

机器学习:PCA(Principal Component Analysis主成分)降维

参考&#xff1a;PCA降维原理 操作步骤与优缺点_TranSad的博客-CSDN博客 PCA降维算法_偶尔努力翻身的咸鱼的博客-CSDN博客 需要提前了解的数学知识&#xff1a; 一、PCA的主要思想 PCA&#xff0c;即主成分分析方法&#xff0c;是一种使用最广泛的数据降维算法。PCA的主要思想…...

linux服务器slab缓存回收方案设计

背景 自己写的回收slab内存ko,insmod报错“shrink_slab:unknown symbol _x86_indirect_thunk_rax(err 0)””; 分析 1.名词解释 在 x86 架构中,函数调用通常使用 call 指令来直接跳转到目标函数的地址。但是,当需要通过函数指针或动态链接调用函数时,就需要使用__x86_…...

Apache Spark 的基本概念

Apache Spark 是一种快速、可扩展、通用的数据处理引擎。它是一种基于内存的计算框架&#xff0c;支持分布式数据处理、机器学习、图形计算等多种计算任务。与传统的 Hadoop MapReduce 相比&#xff0c;Spark 具有更高的性能和更广泛的应用场景。 Spark 中的基本概念包括&…...

通讯协议介绍CoAP 协议解析

目录 1 通讯协议 2 TCP/IP 网络模型 2.1 TCP协议 2.1.1 TCP 连接过程 2.1.2 TCP 断开连接 2.1.3 TCP协议特点 2.2 UDP协议 2.2.1 UDP 协议特点 3 应用层协议简介 3.1 HTTP 协议 3.2 CoAP 协议 3.3 MQTT 协议 4 CoAP 协议详解 4.1 REST 风格 4.2 CoAP 首部分析 4…...

React 开发一个移动端项目(2)

配置基础路由 目标&#xff1a;配置登录页面的路由并显示在页面中 步骤&#xff1a; 安装路由&#xff1a; yarn add react-router-dom5.3.0 5 和 6 两个版本对组件类型的兼容性和函数组件支持有所改变&#xff0c;在这里使用的是 5。 和路由的类型声明文件 yarn add types…...

51单片机 点阵矩阵 坤坤代码

真正的黑子 #include <REGX52.H>void Delay(unsigned int xms); void _74HC595_WriteByte(unsigned char byte); void LED(unsigned char Y,DATA); void LED_Init();sbit RCKP3^5; //RCLK sbit SCKP3^6; //SRCL sbit SERP3^4; //SER //坤坤矩阵 unsigned char code D…...

Android13-图片视频选择器

在compileSDK 33 时&#xff0c;谷歌在安卓新增了 图片选择器 功能&#xff0c;支持单选、多选、选图片、视频等操作&#xff0c;并且不需要额外获取照片/音频权限。 具体实现如下&#xff1a; 1&#xff1a;请求 Log.d(TAG, "Build.VERSION.SDK_INT" Build.VERS…...

【问题处理】GIT合并解决冲突后,导致其他人代码遗失的排查

GIT合并解决冲突后&#xff0c;导致其他人代码遗失的排查 项目场景问题描述分析与处理&#xff1a;1. 警告分析2. 文件分析3. 问题关键4. 验证 解决策略总结 &#x1f4d5;作者简介&#xff1a;战斧&#xff0c;从事金融IT行业&#xff0c;有着多年一线开发、架构经验&#xff…...

H264视频压缩格式

H264简介 H.264从1999年开始&#xff0c;到2003年形成草案&#xff0c;最后在2007年定稿有待核实。在ITU的标准里称为H.264, 在MPEG的标准里是MPEG-4的一个组成部分-MPEG-4 Part 10&#xff0c;又叫Advanced Video Codec&#xff0c;因此常常称为MPEG-4AVC或直接叫AVC。 压缩算…...

动态的中秋爱心演示送女友用python生成爱心软件文末附c++语言写法

用python生成爱心软件 用python生成动态爱心软件 目录 用python生成爱心软件 完整代码 代码解释 逐句解释 效果展示&#xff1a; 如何打包 c写法 完整代码 import turtledef draw_heart():love turtle.Turtle()love.getscreen().bgcolor("black")love.…...

macOS - 使用VLC

文章目录 关于 VLC安装查看帮助流媒体 MRL 语法:URL 语法:主程序 (core)音频视频截图:窗口属性: 子画面屏幕显示&#xff08;OSD&#xff09;:字幕:覆盖:轨道设置:播放控制:默认设备:高级: 输入播放列表性能选项: 热键跳跃大小: 关于 VLC VLC media player VLC 是一款自由、开…...

java微服务项目整合skywalking链路追踪框架

skywalking官网网址&#xff1a;Apache SkyWalking 目录 1、安装skywalking 2、微服务接入skywalking 3、skywalking数据持久化 1、安装skywalking 下载skywalking&#xff0c;本篇文章使用的skywalking版本是8.5.0 Index of /dist/skywalkinghttps://archive.apache.org/…...

pandas 笔记: interpolate

一个用于填充 NaN 值的工具 1 基本用法 DataFrame.interpolate(methodlinear, *, axis0, limitNone, inplaceFalse, limit_directionNone, limit_areaNone, downcast_NoDefault.no_default, **kwargs) 2 主要参数 method 多种插值技术 linear: 默认值&#xff0c;使用线性插…...

应用程序接口(API)安全的入门指南

本文简单回顾了 API 的发展历史&#xff0c;其基本概念、功能、相关协议、以及使用场景&#xff0c;重点讨论了与之相关的不同安全要素、威胁、认证方法、以及十二项优秀实践。 根据有记录的历史&#xff0c;随着 Salesforce 的销售自动化解决方案的推出&#xff0c;首个 Web…...

JavaWeb概念视频笔记

学习地址&#xff1a;102.尚硅谷_Tomcat-Tomcat服务器和Servlet版本的对应关系_哔哩哔哩_bilibili 目录 1.JavaWeb的概念 2.Web资源的分类 3.常用的Web服务器 4.Tomcat服务器和Servlet版本的对应关系 5.Tomcat的使用 a.安装 b.目录介绍 c.如何启动 Tomcat 服务器 另一…...

网络请求【小程序】

一、get 二、post 1.获取相应数据 Page({/*** 页面的初始数据*/data: { inptValue:, isArr:[]},/*** 生命周期函数--监听页面加载*/onLoad(options) {},onSubmit(){// console.log(this.data.inptValue)//2.后台请求数据wx.request({url: https://tea.qingnian8.com/demoArt/…...

手把手教你用STM32实现BLDC电机的SPWM控制(附代码调试心得)

STM32实战&#xff1a;无刷直流电机SPWM控制全解析与代码优化指南 从理论到实践&#xff1a;BLDC电机控制的核心逻辑 第一次接触无刷直流电机(BLDC)控制时&#xff0c;我被它优雅的工作原理所吸引——没有电刷的火花和磨损&#xff0c;却能实现高效的能量转换。在工业自动化、无…...

OpenCore 辅助工具(OCAT):跨平台开源配置工具的零基础上手指南

OpenCore 辅助工具&#xff08;OCAT&#xff09;&#xff1a;跨平台开源配置工具的零基础上手指南 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore&#xff08;OCAT&#xff09; 项目地址: https://gitcode.com/gh_mirrors/oc/OCAuxili…...

基于YOLOv8深度学习的驾驶员分心行为实时检测与语音预警系统【python源码+Pyqt5界面+数据集】

1. 项目背景与核心价值 开车时低头看手机、点烟、喝饮料这些看似平常的小动作&#xff0c;每年导致全球超过120万起交通事故。我去年参与某物流车队安全系统升级时&#xff0c;亲眼见过一个司机因为伸手拿水杯导致车辆偏离车道的事故录像——整个过程不到3秒。这正是我们开发这…...

【Mojo跨语言互操作权威配置白皮书】:实测TensorFlow/NumPy/Pandas三方库零报错接入方案

第一章&#xff1a;Mojo跨语言互操作的核心原理与架构定位Mojo并非传统意义上的独立运行时语言&#xff0c;而是以“Python超集”为设计原点、深度嵌入LLVM生态的系统级编程语言。其跨语言互操作能力不依赖FFI桥接层或胶水代码&#xff0c;而是通过统一的中间表示&#xff08;M…...

零售店长必看:如何用iBeacon+微信小程序打造低成本智能导购(2024最新方案)

零售店长必看&#xff1a;如何用iBeacon微信小程序打造低成本智能导购&#xff08;2024最新方案&#xff09; 走进任何一家现代零售门店&#xff0c;你可能会注意到顾客们不再茫然地寻找商品&#xff0c;而是自然地掏出手机&#xff0c;接收个性化的商品推荐和促销信息。这种无…...

突破语言壁垒:XUnity.AutoTranslator的创新解决方案

突破语言壁垒&#xff1a;XUnity.AutoTranslator的创新解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 当你打开一款期待已久的国外游戏&#xff0c;却发现满屏外文让剧情理解寸步难行&#xff1…...

ChromePass终极指南:3分钟找回Chrome浏览器所有保存密码

ChromePass终极指南&#xff1a;3分钟找回Chrome浏览器所有保存密码 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 你是否曾在Chrome浏览器中保存了重要账号密码&#xff0c;却…...

拆解 OA 系统:从需求梳理到核心执行,新手一看就会

你是不是觉得公司的OA系统特别难用&#xff1f;报销要填八百个字段&#xff0c;不知道哪个是必填&#xff1b;请假批完还得自己跑去找下一个人&#xff1b;找一个去年的合同&#xff0c;得翻十几层文件夹。更气人的是&#xff0c;提了意见根本没人管&#xff0c;说系统改不了。…...

“title“: “Java全栈开发面试实录:从基础到实战的深度对话“,

{ "title": "Java全栈开发面试实录&#xff1a;从基础到实战的深度对话", "content": "# Java全栈开发面试实录&#xff1a;从基础到实战的深度对话\n\n## 一、开场白\n\n面试官&#xff1a;你好&#xff0c;欢迎来参加我们公司的Java全栈开…...

DeepSeek-OCR-2开发者案例:集成至RAG系统实现图文混合检索增强

DeepSeek-OCR-2开发者案例&#xff1a;集成至RAG系统实现图文混合检索增强 1. 项目背景与需求 最近在做一个智能文档问答系统&#xff0c;客户的需求很明确&#xff1a;他们有很多PDF文档&#xff0c;里面既有文字又有图片&#xff0c;用户提问时&#xff0c;系统要能同时理解…...