qsort函数的应用以及模拟实现

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

qsort函数的应用以及模拟实现,c语言进阶,算法,排序算法,数据结构

前言

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏: 🍔🍟🌯 c语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:介绍库函数qsort函数的模拟实现和应用
金句分享:

✨追光的人,终会光芒万丈.✨

一、qsort函数介绍

库函数查询网站(建议使用旧版本查询)

qsort函数的应用以及模拟实现,c语言进阶,算法,排序算法,数据结构
头文件:<stdlib.h>

qsort函数的应用以及模拟实现,c语言进阶,算法,排序算法,数据结构

功能介绍:

使用函数确定顺序,对指向的数组的元素进行排序,每个元素的长度以字节为单位。
此函数使用的排序算法通过调用指定的函数(要自己定义元素比较方式函数传给qsort)并将指向元素的指针作为参数来比较元素.
该函数不返回任何值,而是通过按定义重新排序数组元素来修改指向的数组的内容

参数介绍:

参数1(void* base) 要排序的数组首地址
参数2(size_t num) 数组中的元素个数。
参数3(size_t size) 数组中每个元素的大小(以字节为单位)。
参数4 ( int (compar)(const void,const void*)) 指向数组中元素比较方式的函数指针

二、qsort函数的应用

1.整形数组排序

#include <stdio.h>
#include <stdlib.h>
//注意,由于qsort排序时,并不知道要排序的元素是何种类型,
//所以自定义比较函数的参数都暂时是void*要强制类型转化为对应类型才可以使用.
int int_sort(const void* e1, const void* e2)//自定义整形元素比较方式函数
{
	return  *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr1[10] = { 4,6,1,7,8,2,9,10,3,5 };
	int sz1 = sizeof(arr1) / sizeof(arr1[0]);//计算元素个数
	qsort(arr1, sz1, sizeof(arr1[0]), int_sort);//整形排序
	int i = 0;
	for (i = 0; i < sz1; i++)//整形打印
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

运行结果:

1 2 3 4 5 6 7 8 9 10

2.浮点型数组排序

//浮点型数组排序
#include <stdio.h>
#include <stdlib.h>
int double_sort(const void* e1, const void* e2)//浮点型比较
{
//注意要强制转化为相对于的类型,然后解引用比较.
	int ret = 0;
	if ((*(double*)e1) - (*(double*)e2) > 0)
	{
		ret = 1;//前面的数比后面大时返回整数
	}
	else ret = -1;//后面数大返回负数;
	return ret;//两个数相等返回0;
}
int main()
{
	double arr2[6] = {3.41, 9.45,	4.78,	3.67,	2.9,	7.36 };
	int sz2 = sizeof(arr2) / sizeof(arr2[0]);//计算数组元素个数
	qsort(arr2, sz2, sizeof(arr2[0]), double_sort);
	int i = 0;
	for (i = 0; i < sz2; i++)//浮点型数组打印
	{
		printf("%5.2lf ", arr2[i]);
	}
	return 0;
}

运行结果:

2.90 3.41 3.67 4.78 7.36 9.45

3.字符型排序

//字符型数组排序
#include <stdio.h>
#include <stdlib.h>
int char_sort(const void* e1, const void* e2)//字符型比较
{
	return (*(char*)e1) - (*(char*)e2);
}
int main()
{
	char arr3[10] = { 'd','g','b','a','e','i','h','c','j','f' };
	int sz3 = sizeof(arr3) / sizeof(arr3[0]);//计算元素个数
	qsort(arr3, sz3, sizeof(arr3[0]), char_sort);
	int i = 0;
		for (i = 0; i < sz3; i++)//字符型打印
	{
		printf("%c ", arr3[i]);
	}
}

运行结果:

a b c d e f g h i j

4.结构体数组排序

strcmp函数用于比较字符串的,它的比较方式是比较字符的ASCII码值,并不是长度,后续在库函数模拟篇会讲到.

//结构体排序
#include <stdio.h>
#include <stdlib.h>
struct student//创建结构体类型
{
	char name[15];
	char sex[3];
	int age;
	float stature;
};
typedef struct student sc;//对结构体类型重命名
int sort_age(const void* e1, const void* e2)//按年龄排序
{

	return (((sc*)e1)->age - ((sc*)e2)->age);
}
int sort_name(const void* e1, const void* e2)//按姓名排序
{
	return strcmp(((sc*)e1)->name, ((sc*)e2)->name);
}
int main()
{
		sc arr4[5] = { {"chu jie niu","男",20,1.73f},
				{"xiao wang","男",19,1.68f},
				{"qing niao","女",21,1.59f},
				{"wao shu li","男",16,1.83f},
			{"peng hu wan","男",15,1.81f} };
		int sz4 = sizeof(arr4) / sizeof(arr4[0]);
		//qsort(arr4, sz4, sizeof(arr4[0]), sort_age);
		qsort(arr4, sz4, sizeof(arr4[0]), sort_name);
		int i = 0;
		printf("姓名	    性别   年龄   身高\n");
		for (i = 0; i < sz4; i++)
		{
			printf("%-12s %-5s %-5d %-5.2fm\n", arr4[i].name, arr4[i].sex, arr4[i].age, arr4[i].stature);
		}
		return 0;
}

运行结果:

姓名        性别   年龄   身高
chu jie niu  男    20    1.73 m
peng hu wan  男    15    1.81 m
qing niao    女    21    1.59 m
wao shu li   男    16    1.83 m
xiao wang    男    19    1.68 m

三、qsort模拟实现(采用冒泡排序模拟)

复习一下冒泡排序吧!

void bubble_sort(int* arr, int sz)//冒泡排序
{
	int i = 0, j = 0;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[10] = { 4,7,1,8,2,3,9,10,5,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算元素个数
	bubble_sort(arr, sz);
	for (int i = 0; i < sz; i++)//数组打印
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

qsort模拟实现(采用冒泡排序模拟实现)

第一步:冒泡函数的参数

首先,要修改的是冒泡排序函数的参数.

void bubble_sort(void * arr, size_t num, size_t width, int (cmp)(const void, const void*))

这四个参数的含义上面介绍qsort参数时有介绍.
需要注意的是,qsort函数事先并不知道要传过来的数组是何种类型,所以先用void*接收.

补充知识:

void*可以接收任何类型的变量,但是并不能直接使用,要强制类型转化为对应类型使用.

第二步:比较元素的的方法

if (arr[j] > arr[j + 1])
语句中的arr[j]arr[j+1]有两点需要注意.
由于事先不知道类型
1.要先将arr强制类型转化为char*,因为一个字节是类型的最小单位,这时width就发挥作用了.

arr[j]转化为 (char*)arr + j * width

arr[j+1]转化为 (char*)arr + (j + 1) * width

qsort函数的应用以及模拟实现,c语言进阶,算法,排序算法,数据结构
2.元素的比较方式不再是单一的相减就可以,这里就用到了自定义函数,元素的比较方式函数.

if (cmp((char*)arr + j * width, (char*)arr + (j + 1) * width) > 0)

第三步:交换函数

对于这样只能实现整形的交换方式,肯定是不行的.

int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;

修改为:用char*类型修改交换

swap(char* e1, char* e2, size_t sz)//交换函数
{
	//由于qsort函数事先不知道要比较的元素是何种类型,所以用最小单位一个字节来交换.
	//sz代表元素的所占字节大小
	int i = 0;
	char p = 0;
	for (i = 0; i < sz; i++)
	{
		p = *(e1 + i);
		*(e1 + i) = *(e2 + i);
		*(e2 + i) = p;
	}
}

最后展示全部代码:

#include <stdio.h>
#include <stdlib.h>
struct student//创建结构体类型
{
	char name[15];
	char sex[3];
	int age;
	float stature;
};
typedef struct student sc;//对结构体类型重命名
int sort_age(const void* e1, const void* e2)//按年龄排序
{

	return (((sc*)e1)->age - ((sc*)e2)->age);
}
int sort_name(const void* e1, const void* e2)//按姓名排序
{
	return strcmp(((sc*)e1)->name, ((sc*)e2)->name);
}
int int_sort(const void* e1, const void* e2)//整形比较
{
	return  *(int*)e1 - *(int*)e2;
}
swap(char* e1, char* e2, size_t sz)//交换函数
{
	//由于qsort函数事先不知道要比较的元素是何种类型,所以用最小单位一个字节来交换.
	//sz代表元素的所占字节大小
	int i = 0;
	char p = 0;
	for (i = 0; i < sz; i++)
	{
		p = *(e1 + i);
		*(e1 + i) = *(e2 + i);
		*(e2 + i) = p;
	}
}
//最后一个参数是函数指针,指向两个元素的比较方法这个函数
void bubble_sort(void * arr, size_t num, size_t width, int (*cmp)(const void*, const void*))
{

	int i = 0, j = 0;
	for (i = 0; i < num-1; i++)
	{
		for (j = 0; j < num - 1 - i; j++)
		{
			if (cmp((char*)arr + j * width, (char*)arr + (j + 1) * width) > 0)
			{
				swap((char*)arr + j * width , (char*)arr + (j + 1) * width,width);
			}
		}
	}
}

int main()
{
	int arr[10] = { 4,7,1,8,2,3,9,10,5,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算元素个数
	bubble_sort(arr,sz,sizeof(arr[0]),int_sort);
	for (int i = 0; i < sz; i++)//数组打印
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
	sc arr4[5] = { {"chu jie niu","男",20,1.73f},
		{"xiao wang","男",19,1.68f},
		{"qing niao","女",21,1.59f},
		{"wao shu li","男",16,1.83f},
	{"peng hu wan","男",15,1.81f} };
	int sz4 = sizeof(arr4) / sizeof(arr4[0]);
	qsort(arr4, sz4, sizeof(arr4[0]), sort_age);
	//qsort(arr4, sz4, sizeof(arr4[0]), sort_name);
	int i = 0;
	printf("姓名	    性别   年龄   身高\n");
	for (i = 0; i < sz4; i++)
	{
		printf("%-12s %-5s %-5d %-5.2fm\n", arr4[i].name, arr4[i].sex, arr4[i].age, arr4[i].stature);
	}
	return 0;
}

运行结果:

1 2 3 4 5 6 7 8 9 10
姓名        性别   年龄   身高
peng hu wan  男    15    1.81 m
wao shu li   男    16    1.83 m
xiao wang    男    19    1.68 m
chu jie niu  男    20    1.73 m
qing niao    女    21    1.59 m

qsort函数冒泡排序的模拟实现,就讲到这里了,如果文章有错误或者不理解的地方,欢迎私信牛牛,互相交流,互相学习.

最后,如果文章对大家有帮助的话,求一波三连吧!
💗💗💗886
qsort函数的应用以及模拟实现,c语言进阶,算法,排序算法,数据结构文章来源地址https://www.toymoban.com/news/detail-786515.html

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

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

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

相关文章

  • 【C语言】回调函数(qsort)与模拟实现

    何思何虑,居心当如止水;勿取勿忘,为学当如流水。— 出自《格言联璧·学问类》 解释:无思无虑,心境应当平静如水;不求冒进也不忘记,学业当如流水一般永无止境。 这篇博客我们将会理解回调函数这个概念,以及借用qsort帮助理解,并且最终用qsort的思路来实现冒泡

    2024年02月16日
    浏览(46)
  • C语言库函数之 qsort 讲解、使用及模拟实现

    我们在学习排序的时候,第一个接触到的应该都是冒泡排序,我们先来复习一下冒泡排序的代码,来作为一个铺垫和引入。 代码如下: 很简单的一种排序方法,但我们可以发现一个问题,那就是冒泡排序不够通用,它只能用于整型数组的排序,如果我要排序float类型,或者排

    2024年02月12日
    浏览(40)
  • 【进阶C语言】qsort库函数(详解)

    qsort是C语言库函数里面的一种,包含于#include stdlib.h这个头文件里面,使用快速排序的方法 qsort英语解析:Quick sort,翻译就是快速排序,它的内部实现是通过的快速排序算法来实现的。 功能:对传入的任何数据进行排序,使其变成有序数列。 qsort是可以排序任意类型的数据

    2024年02月02日
    浏览(43)
  • 【C语言进阶篇】快排函数 qsort 详细解析

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,刚开始学编程的时候我们都是用冒泡来进行排序的,今天给大家介绍一下新的排序方法库函数qsort!    ⛳️ sor英文原意是

    2024年02月14日
    浏览(46)
  • 冒泡排序模拟实现qsort()函数

    要模拟qsort()函数,我们首先要知道qsort()函数的特点: 使用快速排序的方法。 适用于任何数据类型的排序。 但由于部分学者还没有学习快速排序算法,所以本篇博客采用冒泡排序来模拟功能类似于qsort()的函数bubble_sort。 C库对qsort()函数解释: 我们得到的关于qsort()函数参

    2024年02月16日
    浏览(56)
  • 模拟实现qsort函数(采用冒泡排序的方式)

    前言: 之前我在C语言:指针详解【进阶】后篇中提到了 qsort函数 , qsort函数 作为一个库函数,在我们日常的代码编写中可能会用到,在上面提到的文章中我们也进行使用了这个函数,大家也了解了一些这个函数的使用方法,但我们作为学习者,我们不仅要会用,还要知道这

    2024年02月05日
    浏览(44)
  • 深入理解回调函数qsort:从入门到模拟实现

    💓博客主页:江池俊的博客 ⏩收录专栏:C语言进阶之路 👉专栏推荐:✅C语言初阶之路 ✅数据结构探索 💻代码仓库:江池俊的代码仓库 ​🎪 社区:GeekHub社区 ​ 🎉欢迎大家点赞👍评论📝收藏⭐ 回调函数和 qsort 是 C语言编程中重要的概念,它们为我们提供了强大的工具

    2024年02月10日
    浏览(53)
  • 【进阶C语言】各大常用库函数的模拟实现

    前言 今天恒川带给大家的是平常应用的库函数,恒川来给大家都模拟实现一下,希望对大家有帮助!! 三种方式: 方式1: 方式2: 方式3: 参考代码: 参考代码: 参考代码: 参考代码: 参考代码: 如果这份博客对大家有帮助,希望各位给恒川一个免费的点赞作为鼓励,

    2023年04月09日
    浏览(37)
  • 用冒泡排序实现快速排序(qsort函数),指针进阶实例

    目录   1、qsort函数是什么 2、冒泡排序实现指针进阶 2.1 主函数 2.2 功能函数声明​编辑 2.3 my_qsort函数介绍 2.4 Swap函数 总结           qsort函数是c语言自带的函数,其功能是实现快速排序。我们来看一下他的参数和返回值:         以上就是qsort的参数和返回值,可以看到,

    2024年02月21日
    浏览(44)
  • c语言用冒泡排序模拟实现qsort排序

    1、简单介绍冒泡排序 冒泡排序就是两两相邻元素进行比较,如果不满足顺序就进行交换。现有一组整数,将其用冒泡排序实现排序为升序。 假设有这样一组整数:9 8 7 6 5    由此可知,如果一个整型数组有num个元素,则需走num-1趟,若走在第i趟,则在第i趟内需要比较num-1

    2024年02月15日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包