快快快快快快快快快快排

这篇具有很好参考价值的文章主要介绍了快快快快快快快快快快排。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

C语言实现快排☺️

快快快快快快快快快快排,c语言
ℹ️为了追求能在最短的时间中做更多的事情,更加便捷。从最早的马车,到🛻,其次到🛤,最后到🛩。都是为了便捷而发明的工具,而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()
{
	//排一个结构体中的age
	test3();
	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模拟之排序结构体age
	test2();
	return 0;
}

💤结束语🎉🎉🎉

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。
快快快快快快快快快快排,c语言文章来源地址https://www.toymoban.com/news/detail-562780.html

到了这里,关于快快快快快快快快快快排的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 快快销ShopMatrix 分销商城多端uniapp可编译5端 - 升级申请(可自定义申请表单)

      在企业或组织中,升级申请通常涉及到员工职位、权限、设备或者其他资源的提升或更新。创建一个可自定义的升级申请表单可以帮助更高效地收集和处理这类申请信息。以下是一个基本的步骤: 确定表单字段 : 申请人信息:姓名、部门、职位、联系方式等。 升级类别:

    2024年01月20日
    浏览(44)
  • 【大语言模型LLM】-基础语言模型和指令微调的语言模型

    🔥 博客主页 : 西瓜WiFi 🎥 系列专栏 : 《大语言模型》 很多非常有趣的模型,值得收藏,满足大家的收集癖! 如果觉得有用,请三连👍⭐❤️,谢谢! 长期不定时更新,欢迎watch和fork!❤️❤️❤️ ❤️ 感谢大家点赞👍 收藏⭐ 评论⭐ 🎥 大语言模型LLM基础-系列文章

    2024年04月28日
    浏览(65)
  • 开发语言漫谈-C语言

           个人认为C语言是最伟大的开发语言(没有之一)。C语言开创了高级语言的新时代。比C更低级的是汇编语言,这个东西就是反人类的玩意。之后的语言或多或少都受C语言的影响。更神奇的是直到现在,C语言还有生命力。C语言的发明人丹尼斯·里奇是图灵奖得主,C语

    2024年04月13日
    浏览(74)
  • Mysql-------SQL:DDL数据定义语言、DDM数据操作语言、DQL数据库查询语言、DQL数据控制语言

    SQL语言可以分为: DDL(Data Definition Language)语言:数据定义语言,用于 创建或更改数据库中的表、视图、索引等对象 DML(Data Manipulation Language)语言:数据操作语言,用来对 数据库表中的数据进行增删改查操作; DQL(Data Query Language)语言: 数据查询语言,用来查询数据库

    2024年02月13日
    浏览(75)
  • C语言入门教程||C语言 头文件||C语言 强制类型转换

    头文件是扩展名为  .h  的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件,需要使用 C 预处理指令  #include  来引用它。前面我们已经看过  stdio.h  头文件,它是编译

    2024年02月02日
    浏览(47)
  • C语言入门教程||C语言 文件读写||C语言 预处理器

    本章我们将介绍 C 程序员如何创建、打开、关闭文本文件或二进制文件。 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件。本章将讲解文件管理的重要调用。 您可

    2024年02月02日
    浏览(43)
  • 【编程语言 · C语言 · 函数指针】

    由于指针可以指向任何存储器位置中的地址,因此它们也可以指向可执行代码的开头。 函数指针或函数指针指向内存中函数的可执行代码。函数指针可以存储在数组中,也可以作为参数传递给其他函数。 函数指针声明使用 * 就像使用任何指针一样: (*func_name)  周围的括号很

    2024年02月10日
    浏览(57)
  • Go语言和C++语言比较

    介绍 GO : Go语言(又称Golang)是由谷歌公司的技术工程师在2007年开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。其设计初衷是为了解决大规模并发处理和互联网应用开发中的问题。 在2007年的一次技术会议中,谷歌公司的技术工程师讨论了C++语言

    2024年01月19日
    浏览(43)
  • 『C语言入门』初识C语言

    在这个数字化时代,计算机编程已经成为连接人类与技术的桥梁。而在编程的世界中,C语言犹如一座承载着无限可能性的基石。作为计算机编程的经典之选,C语言无疑是每个刚刚踏入编程领域的初学者的理想起点。本篇博客将带您踏上一段奇妙的C语言学习之旅,不仅会教您

    2024年02月11日
    浏览(49)
  • C语言之初识C语言

    想必刚接触C语言的同学们不知道C语言是什么?,有什么用,那么你来对了,本系列就会带你入门C语言,从入门到“入土”,开玩笑的,正如标题所说,本教程首先对C语言有一个初步的认识,能够看懂别人写的是什么,有一个大概的框架,那么,我要开始讲解了。 这一章主要

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包