【C语言】qsort函数用法及用冒泡排序实现qsort函数功能_利用qsort实现冒泡排序

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

#include <stdio.h>
#include <stdlib.h>
int cmp\_int(const void\* e1, const void\* e2)
{
	return \*((int\*)e1) - \*((int\*)e2);//默认是升序,将return中e1和e2的位置交换可以使其降序
	//无法对void\*类型的指针进行具体操作,因此要将其强制类型转换为int\*,使其能够在解引用时访问到4个字节
}
int main()
{
	int i = 0;
	int arr[] = { 7,8,9,4,5,6,1,2,3,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算整型数组中有多少个元素
	qsort(arr, sz, sizeof(int), cmp_int);//sizeof(int)是用来计算int类型的数据所占字节数
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);//输出为1 2 3 4 5 6 7 8 9 10
	}
	return 0;
}

注意:当函数的形参为void*类型,要对其进行具体操作时,应该将其强制类型转换为所需的指针类型

2.字符串排序

#include <stdio.h>
#include <stdlib.h>
int cmp\_char(const void\* e1, const void\* e2)//字符串排序
{
	return strcmp((char\*)e1, (char\*)e2);//比较字符大小用strcmp
}
int main()
{
	char arr[] = "badecf";
	int i = 0;
	//int sz = sizeof(arr) / sizeof(arr[0]);//sizeof求字符串长度会将\0算进去,也就是实际计算出来的会比数组中的多1。
	int sz = strlen(arr);//strlen是用来计算字符串长度的,且只能用来计算字符串的长度。
	qsort(arr,sz , sizeof(char), cmp_char);
	printf("%s\n", arr);//abcdef
	return 0;
}

3.字符串长度排序

#include <stdio.h>
#include <stdlib.h>
int cmp\_char\_strlen(const void\* e1, const void\* e2)//比较字符串长度
{
	return strlen(\*(char\*\*)e1) - strlen(\*(char\*\*)e2);//先将e1和e2强制类型转换成为char\*\*类型,再解引用取出数组中字符串的地址,计算字符串长度
}
int main()
{
	//char\* arr[] = {"abcdef" "abc","defs" };
	//也可以通过下面的方式来写指针数组,下面的4行和上面的这一行作用一样
	char\* arr1 = "abc";
	char\* arr2 = "abcd";
	char\* arr3 = "abcdef";
	char\* arr[] = { arr1,arr2,arr3 };
	int i = 0;
	qsort(arr, 3, sizeof(char\*), cmp_char_strlen);
	for (i = 0; i < 3; i++)
	{
		printf("%s\n", arr[i]);//输出结果为 abc defs abcdef
	}
	return 0;
}

4.浮点型数组排序

#include <stdio.h>
#include <stdlib.h>
int cmp\_float(const void\* e1, const void\* e2)//浮点型数组排序
{
	//return (int)(\*(float\*)e1 - \*(float\*)e2);//可能会出错,如12.002和12.001比较之后再强制类型转换为int类型后,结果为0
	if (\*(float\*)e1 - \*(float\*)e2 > 0.000000)
	{
		return 1;//当e1>e2时,返回大于0的数
	}
	if (\*(float\*)e1 - \*(float\*)e2 < 0.000000)
	{
		return -1;//当e1<e2时,返回小于0的数
	}
	else
		return 0;//当e1和e2相等时,返回等于0的数
}
int main()
{
	float arr[3] = { 12.01f,12.03f,12.09f };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组长度
	qsort(arr, sz, sizeof(float), cmp_float);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%f ", arr[i]);//输出结果为12.010000 12.030000 12.090000
	}
	return 0;
}

5.结构体类型排序

#include <stdio.h>
#include <stdlib.h>
struct stu
{
	char name[20];
	int age;
};
int cmp\_s\_age(const void\* e1, const void\* e2)//比较结构体中int类型
{
	return ((struct stu\*)e1)->age - ((struct stu\*)e2)->age;
}
int cmp\_s\_name(const void\* e1, const void\* e2)//比较结构体中char类型的数组
{
	return strcmp(((struct stu\*)e1)->name, ((struct stu\*)e2)->name);
}
int main()
{
	struct stu s[] = { {"zhangsan",21} ,{"lisi",20},{"wangwu",52}};
	int i = 0;
	int sz = sizeof(s) / sizeof(s[0]);
	for (i = 0; i < sz; i++)
	{
		printf("%s %d\n", s[i].name, s[i].age);
	}
	qsort(s, sz, sizeof(struct stu), cmp_s_age);//比较年龄,即比较int类型
	//qsort(s, sz, sizeof(struct stu), cmp\_s\_name);//比较姓名,即比较char类型的数组
	printf("\n");
	for (i = 0; i < sz; i++)
	{
		printf("%s %d\n", s[i].name, s[i].age);//输出为年龄按照升序排列,如果比较姓名,则按照姓名的首字符的ASCII值按照升序排列
	}
	return 0;
}

三、冒泡排序实现qsort函数的功能

1.冒泡排序简介

冒泡排序是通过对两个相邻元素进行比较,如果不符合条件就相互交换位置,并与后面相邻的元素再次比较,直至满足条件为止。
对于冒泡排序,如果它有n个元素,它将进行n-1次的循环。冒泡排序的缺点是只能对整型数组进行排序。
我们通过对整型数组排序进一步了解冒泡排序

//用冒泡排序对整型数组进行排序
#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	int arr[] = { 7,8,9,4,5,6,1,2,3,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz-1; i++)//总共循环sz-1次
	{
		int flag = 1;//标记,假设数组是有序的
		for (j = 0; j < sz - 1 - i; j++)//第一个元素需要和剩余的sz-1个元素比较,第二个元素需要和sz-1-1个元素比较……所以每次循环需要比较的次数为sz-1-i
		{
			if (arr[j] < arr[j + 1])//从大到小排列
			{
				int tmp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = tmp;
				flag = 0;//倘若发生交换说明数组是无序的
			}
		}
		if(flag == 1)
		{
			break;//如果没发生一次交换说明数组已经是符合要求的有序数组
		}
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);//输出结果为 10 9 8 7 6 5 4 3 2 1
	}
	return 0;
}

2.冒泡排序实现qsort函数功能

对冒泡排序进行qsort化时,要参照qsort函数的参数,尽量做到参数一致。
void qsort_bubble(void* base, int sz, int width, int(*cmp)(const void* e1, const void* e2))
void* base表示对应数组元素的起始位置。
int sz表示数组中元素总个数。
int width表示数组中每个元素所占字节数。
int(*cmp)(const void* e1, const void* e2)是函数指针,指向比较两个元素大小的函数。
设计的冒泡排序qsort化函数qsort_bubble与库函数qsort的参数意义相同。在qsort_bubbleqsort参数中函数指针指向的用于比较数组中两个元素大小的函数不用发生改变,可以直接引用。

利用冒泡排序思想实现qsort函数功能并对结构体排序。

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

g-G9AOvuhR-1715850654596)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值