qsort库函数详解

2023-11-11

目录

一、qsort是什么?

二、qsort的功能?

三、qosrt函数详解

1.qsort函数的定义

2.qsort函数的传参

四、qsort的模拟实现(冒泡)

1.如何实现交换?

2.如何实现字节之间的交换


一、qsort是什么?

qsort是C语言库函数里面的一种,包含于#include <stdlib.h>这个头文件里面。

二、qsort的功能?

qsort英语解析:Quick sort,翻译就是快速排序,它的内部实现是通过的快速排序算法来实现的。

功能:对传入的任何数据进行排序,使其变成有序数列。

三、qosrt函数详解

1.qsort函数的定义

在C语言库中是这样定义的:

void qsort (void* base, size_t num, size_t width, int (*cmp)(const void* elem1, const void* elem2))

剖析:

返回类型void:我们改变的是数列的排序,实际只需要进行内存的操作,所以不需要返回值。

参数讲解:

void* base:base基本,即表示应传入初始地址,至于为什么是void*类型,它不知道我们会传入什么数据,而void*类型就像一个垃圾桶一样什么地址都可以仍进去,所以只能用void*类型。

size_t num:num数量,表示应传入的元素个数

size_t width:width宽度,表示应传入的每个元素占的字节大小

int (*cmp)(const void* elem1, const void* elem2):应传入一个比较函数地址,用于比较两个数据的大小,因为传入的数据类型是不确定的,所以我们需要自己定义一个比较函数传到qsort比较函数里面去,以便它知道怎么样去比较两个数据的大小。

2.qsort函数的 传 参

实列代码:

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

//使用者自己实现的比较函数
int Com_int(const void*elem1, const void*elme2)
{
	return *(int*)elem1 - *(int*)elme2;
}

int main()
{
	int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
	int len = sizeof(arr) / sizeof(arr[0]);//数据的个数

	qsort(arr, len, sizeof(arr[0]), Com_int);//传入,数据首地址,数据个数,每个数据占的字节大                
                                             //小,比较函数
	int i = 0;
	for (i = 0; i < len; i++)//打印排完序后的数据
	{
		printf("%d ",arr[i]);
	}


	return 0;
}

四、qsort的模拟实现(冒泡)

1.如何实现交换?

由于qsort函数不知道数据的类型是什么,但是又必须要达到交换两个数据的类容的效果,我们可以从数据的存储这方面想办法,数据储存本质是将自己的二进制序列储存在C语言的程序地址空间中的,所以它只需要将两个数据所占有的全部字节内容交换就可以的。

2.如何实现字节之间的交换

需要交换的字节的大小我们是不知道的,所以我们需要以最低限度来交换地址,将void*型的指针转化为char*类型的指针就可以实现一个字节一个字节之间的交换,这个时候witdh数据宽度的作用和char*型指针的作用就体现出来了

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

typedef struct eleme
{
	int a;
}el;
//使用者自己实现的比较函数
int Com_int(const void*elem1, const void*elme2)
{
	return *(int*)elem1 - *(int*)elme2;
}
int Com_ch(const void* elem1, const void* elem2)
{
	return strcmp((char*)elem1, (char*)elem2);
}
int Com_stu(const void* elem1, const void* elem2)
{
	return (*(el*)elem1).a - (*(el*)elem2).a;
}
//我们使用冒泡排序简单模拟实现一下qsort库函数
void My_Qsort(void* base, size_t num, size_t width, int (*cmp)(const void* e1, const void* e2))
{
	int i = 0;
	for (i = 0; i < num - 1; i++)
	{
		size_t j = 0;
		for (j = 0; j < num - 1; j++)
		{
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				//交换两个数据的全部字节
				for (size_t sz = 0; sz < width; sz++)
				{
					char tmp = *((char*)base + j * width + sz);
					*((char*)base + j * width + sz) = *((char*)base + (j + 1) * width + sz);
					*((char*)base + (j + 1) * width + sz) = tmp;
				}
			}
		}
	}
}
int main()
{
	int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
	char ch1[] = "fbdcea";
	struct eleme stu[3];
	stu[0].a = 30;
	stu[1].a = 20;
	stu[2].a = 10;

	int len = sizeof(arr) / sizeof(arr[0]);
	int len1 = sizeof(ch1) / sizeof(ch1[0]);
	int len2 = sizeof(stu) / sizeof(stu[0]);

	My_Qsort(arr, len, sizeof(arr[0]), Com_int);
	My_Qsort(ch1, len1, sizeof(ch1[0]), Com_ch);
	My_Qsort(stu, len2, sizeof(stu[0]), Com_stu);
	int i = 0;
	for (i = 0; i < len; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("%s\n",ch1);


	return 0;
}

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

qsort库函数详解 的相关文章

随机推荐

  • esp8266 at接收数据中断时间_C51编程18中断篇(串行通讯2)

    MCS 51单片机内部有两个独立的接收与发送SBUF 接收SBUF不能发送 发送SBUF不能接收 它们共用一个地址 99H 内部逻辑结构下图所示 在串行内部逻辑结构中可以看到 串行通信除了与SBUF有关外 还与串行口控制寄存器SCON 地址
  • PCL点云处理之读取与保存PLY文件(点云\网格)(一百五十四)

    PCL点云处理之读取与保存PLY文件 一百五十四 一 PLY文件介绍 二 读取内容 1 点云 2 网格 一 PLY文件介绍 在平常的工作学习 会接触到后缀名为 ply的文件 这是一种常用的存储点云或者网格数据的文件格式 我们可以通过一些方法
  • 两台(或多台)电脑怎么实现文件共享

    关于文件共享 总结了几种实现方式 大家可以根据自己的需求选择合适的共享方式 一 在同一个局域网内 无论是连接的WiFi还是网线 工作的需要 需要共享一些文件 1 找到需要共享的文件夹 或者文件 位置 如下图 比如需要共享 我的电脑的C盘 2
  • 【源码可分享】教你用Python制作自动答题脚本,实现自动答题,100%正确率!

    文章目录 前言 一 自动答题的原理 二 自动答题的步骤 三 Python实现自动答题的方法 总结 前言 当今社会 人们的生活越来越依赖于计算机技术 而Python作为一种高级编程语言 已经成为了众多程序员的首选语言 Python具有简单易学
  • 字符串解析

    知识点 1 split 方法用于把一个字符串分割成字符串数组 2 JSON stringify serilizeUrl sUrl 利用原生JSON对象 将对象转为字符串
  • 遇到DDos攻击勒索保护费,这该怎么办?

    经常会有遇到一些客户过来咨询自己遭到了网络攻击 对方勒索钱财 要是不给就会一直持续攻击下去 许多客户遇到这种情况 找到了德迅云安全询问这种情况有什么办法处理 首先遇到这种事情 这个是不能妥协的 不能助长违法行为 根据以往的经验 只要妥协一次
  • Linux下设置白名单sudo

    Linux下设置白名单sudo 普通账户权限不够 频繁切换root账户比较麻烦 我们可以把自己的普通账户添加到sudoers file中 这样我们可以使用sudo命令在普通用户下提升我们的权限 在root账户下 输入 vim etc sud
  • (论文加源码)基于deap的四分类脑电情绪识别(一维CNN+LSTM和一维CNN+GRU

    论文和源码见个人主页 https download csdn net download qq 45874683 85002721 论文加源码 基于DEAP数据集的1D CNN和RNN情感分类 GRU和LSTM 摘要 在这里 我们研究了脑电情
  • 远程桌面的端口号是多少?

    远程桌面 Remote Desktop 是一种用于远程访问和控制计算机的技术 它允许用户通过网络连接到远程计算机并以图形化界面进行操作 远程桌面使用的端口号通常是3389 在Windows操作系统中 远程桌面协议 Remote Deskto
  • 云服务器内存使用率多少合适,什么时候应当考虑升级主机内存

    根据mysql官方说法 服务器内存占用比例达80 时 属于高负载运行状态了 内存占用比例长时间超过80 时 属于很不稳定状态 长时间超过90 就进入风险区了 这时容易产生数据丢失 数据库崩塌等不安全现象 当然 内存使用率过低又有点资源浪费
  • Wolfram Mathematica 12.3免费安装教程

    注意 本文介绍的Wolfram Mathematica仅为学习用途 如果有条件请支持正版 本文参考自贴吧激活教程 有Github账号的可以点赞支持原作者 https github com TieBaMma InstallTutorial b
  • LVGL V8应用——通过按键切换页面

    一 按键切换对象 程序 全局变量 static lv obj t contanier1 NULL static lv obj t contanier2 NULL 按钮对应回调函数 实现容器的切换 static void win btn ev
  • mybatis-spring-boot-starter依赖对应关系表

    mybatis spring boot starter版本 spring boot starter版本 mybatis版本 mybatis spring版本 2 1 2 2 2 5 RELEASE 3 5 4 2 0 4 2 1 1 2 1
  • HP服务器换硬盘流程,HP服务器SSD硬盘更换操作指南.pptx

    HP服务器SSD硬盘更换操作指南 HP服务器SSD硬盘更换 操作指南 目录 硬盘的安装 准备工作 注意事项 磁盘阵列的创建 创建Raid的流程 注意事项 数据库的创建附加 准备工作 三星磁盘 磁盘托盘 螺丝 这里磁盘托盘 从盒子里拿出来就是
  • YARN异常YarnException:Failed while publishing entity的解决方案

    版本 HDP3 0 mapreduce提交任务计算时 job已经结束 但是容器仍不能关闭持续等待五分钟 INFO Thread 100 org apache hadoop yarn event AsyncDispatcher Waiting
  • 自定义类加载器

    package com bzu csh import java io ByteArrayOutputStream import java io File import java io FileInputStream import java
  • docker容器数据卷

    1 宿主与容器之间映射添加容器卷 privileged true 数据卷的特权 docker run it privileged true v 宿主机绝对路径目录 容器内目录 镜像名 docker run it privileged tru
  • 在手机上通过ssh连接树莓派

    第一步 在手机上下载ConnectBot 豌豆荚上有的下 第二步 Ubuntu 上开启ssh服务 第一次按使用的话需要搭建环境 命令是 sudo apt get install openssh server 第三步 启动SSH服务 sudo
  • Yolov5训练自己的数据集

    本文介绍了如果通过Yolov5框架训练自己的数据集 主要内容包括数据集格式 数据集拆分方法 描述文件修改以及训练和测试方法 还没有搭建Yolov5环境的可以参考我上一篇博文 Yolov5目标检测环境搭建过程 Cuda Pytorch Yol
  • qsort库函数详解

    目录 一 qsort是什么 二 qsort的功能 三 qosrt函数详解 1 qsort函数的定义 2 qsort函数的传参 四 qsort的模拟实现 冒泡 1 如何实现交换 2 如何实现字节之间的交换 一 qsort是什么 qsort是C