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

news2025/1/25 7:42:21

个人主页:点我进入主页

专栏分类: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就可以解决。

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

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

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

相关文章

Java笔记:Arthas-Java线上异常排查

一、安装 arthas在github上有个page&#xff0c;地址是https://alibaba.github.io/arthas/。 安装的方式有好几种&#xff1a; 1.直接下载一个可以启动的jar包然后用java -jar的方式启动 2.用官方提供的as.sh脚本一键安装 3.用rpm的方式安装 本篇介绍第一种方式&#xff0c;因…

无涯教程-JavaScript - EXP函数

描述 EXP函数返回e升至数字的幂。常数e等于自然对数的底数2.71828182845904。 语法 EXP (number)争论 Argument描述Required/OptionalNumberThe exponent applied to the base e.Required Notes 要计算其他碱基的幂,请使用幂运算符(^) EXP是LN的倒数,LN是数字的自然对数…

基于SSM的汽车租赁后台管理系统

基于SSM的汽车租赁后台管理系统 介绍 包括登录、首页、客户管理、车辆管理、汽车出租、出租单管理、汽车入库、检查单管理、系统管理等功能&#xff0c;适合二次开发课程设计、毕业设计等 软件架构 SSM 运行环境 数据库 mysql 安装教程输入链接说明 端口&#xff1a;3306…

第16篇ESP32 platformio_arduino框架 wifi联网_连接WiFi热点并连接tcp server收发数据进行通讯

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

BeanFactory版本的快速入门

目录 IOC原理 IOC工作步骤 开发步骤 实现代码 DI原理 DI工作步骤 IOC原理 在Spring框架中&#xff0c;IOC是通过Bean容器&#xff08;例如ApplicationContext&#xff09;来实现的。Bean容器负责管理Bean的创建、依赖关系的注入和对象的生命周期的控制。通过配置文件&am…

【软件设计师-从小白到大牛】上午题基础篇:第一章 计算机组成与体系结构

文章目录 前言章节提要一、数据的表示&#xff08;进制的转换&#xff09;1、R进制转十进制使用按权展开法2、十进制转R进制使用短除法(余数从下往上排列&#xff09;3、二进制转八进制与十六进制 二、数据的表示&#xff08;原码反码补码移码&#xff09;真题链接 三、数据的表…

国内券商有没有量化交易接口,哪家做的比较好

个人账户实现股票量化程序化自动交易&#xff0c;券商有接口&#xff0c;门槛已降低_股票程序交易接口的博客-CSDN博客 凡是开了量化交易接口的券商做的都不错&#xff0c;关键看适不适合你自己 我在用的是python语言&#xff0c;有本地客户端&#xff0c;随时修改随时调整策略…

基于Java的考编论坛网站的设计与实现(亮点:在线发布帖子、内容评论回复、购买二手物品、在线支付)

考编论坛网站 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 前端界面…

直方图均衡化,画出均衡化后的直方图(数字图像处理大题复习 P2)

文章目录 1. 频率2. 累计直方图3. 取整4. 得到对应关系5. 累加对应关系&#xff0c;得出结果6. 画出均衡化后的直方图 1. 频率 一般题目会给出各个灰度级的概率分布&#xff0c;如果没有给概率&#xff0c;而是给了频率&#xff0c;比如&#xff1a; 在 8x8 的图像中&#xf…

有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序

输入描述:第一行输入一个整数(0<N<50)。第二行输入N个升序排列的整数&#xff0c;输入用空格分隔的N个整数。第三行输入想要进行插入的一个整数 输出描述:输出为一行&#xff0c;N 1个有序排列的整数 输入:5 1 6 9 22 30 8 输出:1 6 8 9 22 30 思路&am…

深入理解Kubernetes Pod调试

调试运行中的容器和Pod不像直接调试进程那么容易&#xff0c;本文介绍了通过临时容器共享命名空间的方式调试业务容器进程的方法。原文: Debugging Kubernetes Pods: Deep Dive ZanUnsplash 调试pod最简单的方法是在有问题的pod中执行命令&#xff0c;并尝试排除故障。这种方法…

TS泛型的使用

函数中使用泛型&#xff1a; function identity<T>(arg: T): T {return arg; }let result identity<number>(10); // 传入number类型&#xff0c;返回number类型 console.log(result); // 输出: 10let value identity<string>(Hello); // 传入string类型&a…

【微信小程序】scroll-view的基本使用

| scss里面的.item:nth-child(1) index.wxml <view class"scroll"> <scroll-view scroll-x><navigator url"" wx:for"{{6}}" wx:key"index" class"item"><image class"pic" src"/sta…

12.建造者模式

如果你需要将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示的意图时&#xff0c;我们需要应用于一个设计模式&#xff0c;‘建造者&#xff08;Builder&#xff09;模式’&#xff0c;又叫生成器模式。建造者模式可以将一个产品的内部表象…

差分方程模型:基金运作与管理

背景 诺贝尔奖 在他逝世的前一年&#xff0c;立嘱将其遗产的大部分(约920万美元)作为基金&#xff0c;将每年所得利息分为5份&#xff0c;设立物理、化学、生理或医学、文学及和平5种奖金(即诺贝尔奖)&#xff0c;授予世界各国在这些领域对人类作出重大贡献的人。其中炸药为最…

深度解析shell脚本的命令的原理之ls

ls是一个常用的Unix和Linux命令&#xff0c;它的功能是列出目录内容。当运行ls命令时&#xff0c;操作系统会执行一系列步骤&#xff0c;以获取和显示指定目录中的文件和子目录。以下是对这个命令的深度解析&#xff1a; 解析参数和选项&#xff1a;首先&#xff0c;ls命令会解…

微服务 第三章 Spring Cloud 简介

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 文章目录 系列文章目录[TOC](文章目录) 前言&#xff1a;Spring Cloud是一款基于 Spring Boot 实现的微服务框架1、Spring Cloud 的常用组件如下表所示。2、Spring…

每日一博 - 常见的数据结构

文章目录 概述图解Use Case 概述 &#x1f539; 链表&#xff08;List&#xff09;&#xff1a;用于保存Twitter的信息流。 &#x1f539; 栈&#xff08;Stack&#xff09;&#xff1a;支持文字编辑器的撤销/重做功能。 &#x1f539; 队列&#xff08;Queue&#xff09;&…

【李沐深度学习笔记】数据操作实现

课程地址 数据操作实现p2 数据操作 首先导入PyTorch包&#xff08;import torch)&#xff0c;虽然叫PyTorch&#xff0c;但实际上要导入torch。 import torch张量 张量表示的是一个数值组成的数组&#xff0c;这个数组可以有很多个维度。 # 生成0-11的顺序序列构成的一维…

海康威视热成像实时测温java - 23版

在20年写了一篇实时测温demo博客&#xff0c;看来帮了不少人。今天刚好又有需求&#xff0c;需要采温。也碰到了不少问题&#xff0c;特此记录 1、环境 摄像头&#xff1a;海康 型号&#xff1a;DS-2TD2528T-7/Q 序列&#xff1a;EA0406775 服务器&#xff1a;winServer J…