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

qsort快速排序的实现以及模拟实现qsort的功能(狠狠的拿捏)

当你为错过太阳而哭泣的时候,你也要再错过群星了。          --泰戈尔

 

目录

一.qsort快速排序的实现

二.模拟实现一个qsort功能的函数


一.qsort快速排序的实现

下面是 qsort() 函数的声明

void qsort(void *base, size_t nitems, size_t size, int (*compare)(const void *p1, const void* p2))

注意p1和p2是待比较两个数的地址,你不能直接写成*p1和*p2来找到这两个数,因为p1和p2都是void*的指针,无类型的指针。void*可以接收任何类型的指针,所以使用*p1和*p2时,你必须强制类型转换为你需要的类型。

参数: 

  • base -- 指向要排序的数组的第一个元素的指针。
  • nitems -- 由 base 指向的数组中元素的个数。
  • size -- 数组中每个元素的大小,以字节为单位。
  • compare -- 用来比较两个元素的函数,其实就是一个函数指针。

对一个数组里面的数字进行升序排序,可以使用冒泡排序(之前写的) ,但是冒泡排序效率比较低,而且只能对数字进行排序,但是qsort函数可以实现各种各样的排序

我们就先来使用qsort来对数组的数字进行升序排序。

#include<stdio.h>
#include<stdlib.h>//qsort所需要的头文件
int cmp_int(const void* p1, const void* p2)
//cmp_int这个函数是我们使用者提供的,你可以随便写成什么名字
{return (*(int*)p1 - *(int*)p2);//(int*)强制类型转换为整型指针,再解引用找到元素
}
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[10] = { 5,3,7,8,9,1,2,0,4,6 };//void qsort(void* base, size_t nitems, size_t size, int (*compare)(const void* p1, const void* p2))int sz = sizeof(arr) / sizeof(arr[0]);//求的数组的大小,对应的就是nitems//这里的arr对应base//sizeof(arr[0])对应的就是size,数组每个元素的字节大小qsort(arr, sz, sizeof(arr[0]), cmp_int);print(arr, sz);return 0;
}

我们再来使用qsort来实现复杂一点点的结构体名字排序,你就会感到qsort的神奇之处。

我们对一个字符串进行比较,自然要用到strcmp函数。

strcmp函数:用于比较两个字符串的ASCll值并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数,strcmp函数是对字符串一个一个字符进行比较,如果第一个字符串的第一个字符已经大于第二个字符串的第一个字符了,strcmp就直接返回0了,就不用继续比较下面的字符串了。

比如:abcdffbb字符串进行比较,因为a的ASCll值已经小于f的ASCll值了,所以返回小于0。比较结束。

#include<stdio.h>
#include<stdlib.h>
struct stu
{int age;char name[20];
};
int cmp_name(const void* p1, const void* p2)
{return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);//指针访问结构体变量使用->
}
void print(struct stu S[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s\n", S[i].name);}
}
int main()
{struct stu S[] = { {20,"chen kang"},{19,"wang ti"},{21,"di shu"} };//创建一个结构体数组int sz = sizeof(S) / sizeof(S[0]);qsort(S, sz, sizeof(S[0]), cmp_name);print(S, sz);return 0;
}

上面我们使用qsort函数来排序数组和结构体中的字符串,可以看出qsort不用像冒泡排序那样确定趟数,而是qsort自己继续往后面排序。

总结qsort函数优点:

1.不需要确定趟数。

2.可以对各种类型进行排序。

二.模拟实现一个qsort功能的函数

接下来我们就要来写一个模拟qsort函数功能的函数,来理解qsort函数到底是如何进行排序的

#include<stdio.h>
void Swap(char* p1, char* p2, int width)
{int i = 0;for (i = 0; i < width; i++){	//width就是一个数的字节大小char temp = 0;temp = *p1;*p1 = *p2;*p2 = temp;p1++;p2++;//通过一个一个的字节交换,从而将一个数交换}
}
void sml_qsort(void* base, size_t num, size_t width, int(*cmp)(const void* p1, const void* p2))
{//size_t表=表示无符号整型,这里也可以写成intint i = 0;int j = 0;for (i = 0; i < num - 1; i++){for (j = 0; j < num - 1 - i; j++){if (cmp((char*)base + j * width ,(char*)base + (j + 1) * width) > 0){//(char*)base + j * width就是一个数的全部字节大小,无论是排序什么类型,都可以这样使用//这里调用cmp指针从而调用cmp_int函数,而cmp_int就是比较两个数的大小//cmp就是一个回调函数Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);}}}
}
int cmp_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[10] = { 1,4,7,3,2,5,8,0,9,6 };int sz = sizeof(arr) / sizeof(arr[0]);sml_qsort(arr, sz, sizeof(arr[0]),cmp_int);//sml是simulation单词的缩写,也就是模拟的意思print(arr, sz);return 0;
}

我们还可以用sml_sqort函数来排序结构体等等,只需要修改一点点代码就可以实现。这里大家就可以自己动手尝试。 

希望大家给老弟赞赞,谢谢!

相关文章:

qsort快速排序的实现以及模拟实现qsort的功能(狠狠的拿捏)

当你为错过太阳而哭泣的时候&#xff0c;你也要再错过群星了。 --泰戈尔 目录 一.qsort快速排序的实现 二.模拟实现一个qsort功能的函数 一.qsort快速排序的实现 下面是 qsort() 函数的声明&#xff1a; void qsort(void *base, size_t nitems, size_t size, int (…...

[Java·算法·中等]LeetCode215. 数组中的第K个最大元素

每天一题&#xff0c;防止痴呆题目示例分析思路1题解1分析思路2题解2分析思路3题解3&#x1f449;️ 力扣原文 题目 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不…...

xgboost:算法数学原理

xgboost算法数学原理 1、求预测值 y^iϕ(xi)∑k1Kfk(xi),fk∈F,(1)\hat{y}_i\phi\left(\mathbf{x}_i\right)\sum_{k1}^K f_k\left(\mathbf{x}_i\right), \quad f_k \in \mathcal{F},\tag{1} y^​i​ϕ(xi​)k1∑K​fk​(xi​),fk​∈F,(1) F{f(x)wq(x)}(q:Rm→T,w∈RT)\mathca…...

map、multimap、unordered_map

引用&#xff1a;windows程序员面试指南 map map 红黑树 map 对value值无要求 map 有序&#xff0c;按照key值自动排序 map key值唯一 map 头文件&#xff1a;#include map 支持重载[]的运算符 map 为保持有序性&#xff0c;erase()开销大 multimap multimap 红黑树 multim…...

2023年全国最新会计专业技术资格精选真题及答案11

百分百题库提供会计专业技术资格考试试题、会计考试预测题、会计专业技术资格考试真题、会计证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 一、选择题 1.下列各项中&#xff0c;仅将生产过程中消耗的变动成本计入产品成本…...

Centos7搭建NFS

1.NFS简介Network File System(网络文件系统&#xff0c;通过网络让不同的机器系统之间可以彼此共享文件和目录&#xff0c;类似Samba服务。2.NFS挂载原理 在网络中服务器和客户端进行连接都是通过端口进行数据传输&#xff0c;而NFS服务端的端口是随机的&#xff0c;从而导致N…...

ThreadLoca基本使用以及与synchronized的区别

文章目录1. ThreadLocal介绍1.1 官方介绍1.2 基本使用1.2.1 常用方法1.2.2 使用案例1.3 ThreadLocal类与synchronized关键字1.3.1 synchronized同步方式1.3.2 ThreadLocal与synchronized的区别2. 运用场景_事务案例2.1 转账案例2.1.1 场景构建2.1.2 引入事务2.2 常规解决方案2.…...

【C++】纯虚函数、纯虚析构

纯虚函数语法&#xff1a;virtual 返回值类型 函数名(参数列表) 0纯虚函数的作用&#xff1a;不用定义&#xff01;在多态中&#xff0c;通常父类中虚函数的实现是无意义的&#xff08;因为主要用子类重写的&#xff0c;父类只是为了派生子类当做一个类族的顶层出现&#xff0…...

Python 进阶小技巧:7招展开嵌套列表

大家好&#xff0c;今天给大家讲解一个Python的进阶知识点&#xff1a;如何将一个嵌套的大列表展开形成一个列表。 小编提供了7种方法供大家学习参考&#xff1a; for循环 列表推导式 使用第三方库itertools 使用sum函数 python自加&#xff08;&#xff09; 使用extend函…...

【Spring6】| Bean的作用域

目录 一&#xff1a;Bean的作用域 1. singleton&#xff08;单例&#xff09; 2. prototype&#xff08;多例&#xff09; 3. 其它scope 4. 自定义scop&#xff08;了解&#xff09; 一&#xff1a;Bean的作用域 1. singleton&#xff08;单例&#xff09; &#xff08;1…...

Qt界面美化之自定义qss样式表

原生的QT界面不好看&#xff0c;有时候需要根据美工的设计图修改样式。如果使用QML的话搞界面是快&#xff0c;但是QML有点儿吃内存&#xff0c;有时简单的功能还是用传统c的widget方便些。好在有qss&#xff0c;传统界面也可以美化的。QSS称为Qt Style Sheets也就是Qt样式表&a…...

春招进行时:“211文科硕士吐槽工资5500” HR:行情和能力决定价值

学历重要&#xff0c;还是能力重要&#xff1f; 春招进行时&#xff0c;不少学生求职遇冷&#xff0c;会把原因归结为学历水平不够高、毕业院校不够档次、专业不够热门、非一线城市就业机会少等等。 直到上海一位211大学的文科男硕士&#xff0c;吐槽招聘会提供的岗位薪资待遇…...

【DaVinci Developer专题】-45-自动生成SWC中所有Runnable对应的C文件

点击返回「Autosar从入门到精通-实战篇」总目录 案例背景(共5页精讲): 在DaVinci Developer中,以Test_A_SWC的Runnable为例,见图0-1。我们现在尝试自动生成一个包含Test_A_SWC_Init和Test_A_SWC_Main函数原型(也是适用于 C/S Port Serve Runnable)的C文件。 图0-1 目…...

redis启动和关闭服务脚本

编译安装redis&#xff0c;自己写了个脚本。 简单实现启动、关闭和 查看redis服务。 基本流程如下&#xff1a; 脚本执行&#xff0c;必须附带1个参数&#xff0c;没有参数会提示附带参数。 脚本会获取redis-server进程数量。作为开启、关闭以及查看redis服务的数据依据。 …...

windows CMD快捷键:

&#x1f431;个人主页&#xff1a;莎萌玩家&#x1f64b;‍♂️作者简介&#xff1a;全栈领域新星创作者、专注于全栈各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01;&#x1f4ab;系列专栏&#xff1a;网络爬虫、WEB全栈开发&#x1f4e2;资料领取…...

【C/C++语言】刷题|双指针|数组|单链表

主页&#xff1a;114514的代码大冒 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 一、删除有序数组中的重复项 二、合并两个有序数组 三&#xff0c;移除…...

Leetcode.1487 保证文件名唯一

题目链接 Leetcode.1487 保证文件名唯一 Rating &#xff1a; 1697 题目描述 给你一个长度为 n的字符串数组 names。你将会在文件系统中创建 n个文件夹&#xff1a;在第 i 分钟&#xff0c;新建名为 names[i]的文件夹。 由于两个文件 不能 共享相同的文件名&#xff0c;因此如…...

python-星号(*)-双星号(**)-函数动态参数匹配-解包操作

文章目录1.乘法和幂运算符2.函数接收数量不固定的入参3.限制函数入参仅以关键字形式输入4. 可迭代对象解包操作5.扩展可迭代对象解包1.乘法和幂运算符 ● 单个 * 用于乘法运算 ● 两个 ** 表示幂运算 >>> 2*3 >>> 6 >>> 2**3 >>> 82.函数…...

面试官:为什么说ArrayList线程不安全?

本博客知识点收录于&#xff1a;⭐️《JavaSE系列教程》⭐️ 1&#xff09;线程安全与不安全集合 我们学习集合的时候发现集合存在由线程安全集合和线程不安全集合&#xff1b;线程安全效率低&#xff0c;安全性高&#xff1b;反之&#xff0c;线程不安全效率高&#xff0c;安…...

STP详解

STP STP全称为“生成树协议”&#xff08;Spanning Tree Protocol&#xff09;&#xff0c;是一种网络协议&#xff0c;用于在交换机网络中防止网络回路产生&#xff0c;保证网络的稳定和可靠性。它通过在网络中选择一条主路径&#xff08;树形结构&#xff09;&#xff0c;并…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...