快快快快快快快快快快排

作者简介:დ旧言~,目前大一,现在学习Java,c,Python等
座右铭:松树千年终是朽,槿花一日自为荣。
望小伙伴们点赞👍收藏✨加关注哟💕💕

C语言实现快排☺️

在这里插入图片描述
ℹ️为了追求能在最短的时间中做更多的事情,更加便捷。从最早的马车,到🛻,其次到🛤,最后到🛩。都是为了便捷而发明的工具,而C语言中人们也发明更加便捷的排序,我们称之为------快排。🫤🫤🫤
ℹ️我们最初认识的冒泡法,逻辑简单,但是使用起来单一,占据更多内存,冒泡法的短板及其明显。而快排逻辑复杂,可以解决多种排序问题,并且占据少量的内存。大家跟上我的步伐,一起来看看C语言的快排到底是个啥🏂

💤使用快排

在这里插入图片描述

1️⃣快排知识

我们知道快排这个函数有四个参数void* base, size_t num, size_t size,int (compar)(const void,const void*)

🔹void* base:指向需要排序的数组的第一个元素地址。
🔹size_t num:排序的元素个数。
🔹size_t size:一个元素的大小单位字节数。
🔹int (compar)(const void,const void*):是一个函数指针,指向有两个参数,参数类型为const void*
🔹void*:无具体类型的指针,可以接受任意类型指针。(不能直接解引用操作,也不能直接进行指针运算)

2️⃣快排使用

调用qsort函数方法为:qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),int_cmp)

▪️第一个参数:为数组名
▪️第二个参数:数组元素个数
▪️第三个参数:数组类型大小
▪️第四个参数:调用一个比较函数(比较函数需要自己实现)

3️⃣举个栗子

🚩排一个整数数组

▫️写出主函数
▫️在主函数调用 qsort 函数
▫️模拟实现比较函数

上代码🙉🙉🙉

#include<stdio.h>
#include<stdlib.h>//快排函数的头文件
#include<string.h>//排一个整数数组
int int_cmp(const void* p1,const void* p2)
{return *(int*)(p1)-*(int*)(p2);
}void test1()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);//调用快排函数qsort(arr, sz, sizeof(arr[0]), int_cmp);//打印int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}int main()
{//排序整数数组test1();return 0;
}

🚩排一个结构体中的 age

▫️写出主函数
▫️在主函数调用 qsort 函数
▫️模拟实现比较函数

上代码🙉🙉🙉

#include<stdio.h>
#include<stdlib.h>//快排函数的头文件
#include<string.h>//排一个结构体
struct stu
{char name[20];int age;
};int struct_cmp(const void* p1, const void* p2)
{return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}void test3()
{struct stu arr[3] = { {"zhangsan",20},{"lisi",19},{"wangwu",18} };int sz = sizeof(arr) / sizeof(arr[0]);//调用快排函数qsort(arr, sz, sizeof(arr[0]), struct_cmp);//打印int i = 0;for (i = 0; i < 3; i++){printf("%s %d\n", arr[i].name, arr[i].age);}
}int main()
{//排一个结构体中的agetest3();return 0;
}

💤模拟快排

为了更加深入快排知识,我们来模拟这个函数🤪🤪🤪

1️⃣模拟快排方法

💦写出主函数
💦主函数调用模拟的快排函数**(这里需要调用交换函数,返回值函数)**
💦写出返回值函数

2️⃣模拟快排知识

🚩返回值函数

这里的返回值函数就和上面的调用比较函数一样

//整数函数比较函数
int int_cmp(const void* p1,const void* p2)
{return *(int*)(p1)-*(int*)(p2);
}
//结构体函数比较函数
int struct_cmp(const void* p1, const void* p2)
{return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}

🚩交换函数

因为需要满足每种类型的交换,因此不可能交换类型,只能交换每一个字节大小
我们知道,char的字节数为一个字节,这样的话,我们可以把每种类型都转换成char类型大小,就可以实现字节进行交换。

调用交换函数实参(char*)arr + j * size(强转成char类型,偏移一个元素类型大小)

void Swap(char* p1, char* p2,int size)
{int i = 0;char tmp = 0;for (i = 0; i < size; i++){tmp = *p1;*p1 = *p2;*p2 = tmp;p1++;p2++;}
}

🚩调用快排函数

🔹调用快排函数为四个参数

  1. ▪️第一个参数:为数组名
    ▪️第二个参数:数组元素个数
    ▪️第三个参数:数组类型大小
    ▪️第四个参数:调用一个比较函数(比较函数需要自己实现)

🔹先一个元素交换,后面一个元素字节数交换(采用两个for循环

上代码🙉🙉🙉

void bubble_sort(void* arr, int sz, int size, int(*cmp_int)(void*, void*))
{int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - i - 1; j++){if (cmp_int(  (char*)arr + j*size , (char*)arr + (j + 1)*size   ) > 0){Swap((char*)arr + j * size, (char*)arr + (j + 1) * size, size);}}}
}

3️⃣举个栗子

🚩排一个整数数组

//返回值函数
int cmp_int(const int* p1, const int* p2)
{return *(int*)(p1)-*(int*)(p2);
}//交换函数
void Swap(char* p1, char* p2,int size)
{int i = 0;char tmp = 0;for (i = 0; i < size; i++){tmp = *p1;*p1 = *p2;*p2 = tmp;p1++;p2++;}
}//模拟快排
void bubble_sort(void* arr, int sz, int size, int(*cmp_int)(void*, void*))
{int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - i - 1; j++){if (cmp_int(  (char*)arr + j*size , (char*)arr + (j + 1)*size   ) > 0){Swap((char*)arr + j * size, (char*)arr + (j + 1) * size, size);}}}
}//排序整数数组
void test1()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);//打印int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}int main()
{//实现qsort模拟之排序整数数组test1();return 0;
}

🚩排一个结构体中的 age

//返回值函数
struct stu//定义结构体
{char name[20];int age;
};
int cmp_struct(const int* p1, const int* p2)
{return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}//交换函数
void Swap(char* p1, char* p2,int size)
{int i = 0;char tmp = 0;for (i = 0; i < size; i++){tmp = *p1;*p1 = *p2;*p2 = tmp;p1++;p2++;}
}//模拟快排
void bubble_sort(void* arr, int sz, int size, int(*cmp_int)(void*, void*))
{int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - i - 1; j++){if (cmp_int(  (char*)arr + j*size , (char*)arr + (j + 1)*size   ) > 0){Swap((char*)arr + j * size, (char*)arr + (j + 1) * size, size);}}}
}//排序结构体age
void test2()
{struct stu arr[3] = { {"zhangsan",20},{"lisi",19},{"wangwu",18} };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_struct);//打印int i = 0;for (i = 0; i < 3; i++){printf("%s %d\n", arr[i].name, arr[i].age);}
}int main()
{//实现qsort模拟之排序结构体agetest2();return 0;
}

💤结束语🎉🎉🎉

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 系列1 -- 概念、创建和使用

目录 1. 什么是Spring Boot? 2. Spring Boot 的优点 3. Spring Boot 项目的创建 3.1 使用IDEA创建 3.2 网页版创建 4. 项目目录和项目运行 4.1 项目目录 4.2 运行项目 4.3 使用Spring Boot项目实现网页输出Hello World 5. 路径问题 1. 什么是Spring Boot? Spring …

jdk11缺少jre的问题解决

问题&#xff1a;升级jdk的时候文件中缺少jre&#xff0c;导致项目启动报错 jdk11不在默认用户强制安装jre&#xff0c;所以jdk包中不在包含jre文件 解决步骤1&#xff1a;进入jdk安装包的根目录&#xff0c;输入cmd 解决步骤2&#xff1a;在cmd中输入以下命令 bin\jlink.e…

NAT转换网关实现IP地址转换,保障数据采集

NAT转换网关&#xff08;Network Address Translation Gateway&#xff09;是物通博联推出的一款物联网设备&#xff0c;用于在不同网络之间进行网络地址转换&#xff08;Network Address Translation&#xff09;&#xff0c;以实现IP地址的转换和映射。 物通博联NAT转换网关…

XUbuntu22.04之vim无法复制内容到系统(一百八十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【方法】公众号上传的视频不能横屏播放,如何解决?

目录 说明 解决步骤 步骤一&#xff1a;开启微信横屏模式 步骤二&#xff1a;打开手机自动旋转功能 说明 直接用手机打开公众号文章上内嵌的视频&#xff0c;发现只能横屏播放&#xff0c;无法全屏查看。 这个时候学习&#xff0c;尤其是看视频课程的时候无法看清楚全图。…

华为云命令行工具服务KooCLI助力一键管理云资源

对于CLI即命令行工具&#xff0c;运维同学可能并不陌生&#xff0c;它摒弃了对图形化界面的需求&#xff0c;不再拘泥于可视化的页面切换、按钮点击等操作&#xff0c;反而为用户提供了一个便捷且高控制的解决方案&#xff0c;使用户在日常的运维工作中&#xff0c;用一行命令即…

Redis安装与配置指南:适用于Windows、Mac和Linux系统的详细教程

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

分布式数据库HBase,它到底是怎么组成的?

原文链接&#xff1a;http://www.ibearzmblog.com/#/technology/info?id3f432a2451f5f9cb9a14d6e756036b67 前言 大数据的核心问题无非就是存储和计算这两个。Hadoop中的HDFS解决了数据存储的问题&#xff0c;而HBase就是在HDFS上构建&#xff0c;因此Hbase既能解决大数据存…

计算机网络|思维导图|自顶向下方法|MindMaps资料分享

前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结&#xff0c;每一篇都是超级用心编写的&#xff0c;有兴趣的伙伴们都支…

代码随想录算法训练营day2 | 977. 有序数组的平方,209. 长度最小的子数组

目录 977. 有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II 977. 有序数组的平方 977. 有序数组的平方 难度&#xff1a;easy 类型&#xff1a;双指针&#xff08;相向指针&#xff09; 思路&#xff1a; 暴力法是将每个数都平方后&#xff0c;再排序(快排)&#…

问题解决:idea克隆项目依赖无法解析

问题描述尝试解决方案 问题描述 从git远程仓库clone了一个springboot项目, 然后项目的pom.xml文件的依赖全部加载失败,全部是Project 某某某依赖 not found 的错误,几十条 代码就更不用看了,只要用到依赖,全部报错. 看着报错就头大 尝试解决方案 检查maven配置是否正确 检查是…

Tomcat 应用服务 WEB服务

简述&#xff1a; 中间件产品介绍 目前来说IBM的WebSphere&#xff0c;Oracle的Weblogic占据了市场上Java语言Web站点的部分份额&#xff0c;该两种软件由于无与伦比的性能及可靠性等优势被广泛应用于大型互联网公司的Web场景中&#xff0c;但是其高昂的价格也使得中小型互联…