10分钟可学会的用《冒泡排序》排序任何数据类型,模拟qsort函数

在这里插入图片描述

🔊🔊🔊
🇨🇳大家好,我是_奇奇,暂时为一名C语言博主。河牧院大一在读。
🔔喜欢交朋友,欢迎大家和我一起交流学习
❤️编程的前途是光明的,道路是曲折的。笑到最后才是赢家🍺
🌳我觉得坦途在前,人又何必为了一些小障碍而不走路呢 --鲁迅

1.qsort函数原型

  • qsort函数C语言函数库自带的排序函数。它可以排序所有的数据类型。包括年龄,姓名,结构体。等等
  • q代表quick的意思。sort是排序的意思。(所以称为快速排序)
  • qsort 的函数原型如下,一共四个形参。qsort函数包含在C 标准库 - <stdlib.h>中。

void qsort( void *base, //base是要排序数组的首元素地址
int num, //num是要排序数组的长度
int width, //width需要排序的元素的数据类型大小(单位是字节)
int ( *compare )(const void *e1, const void *e2 ) );//函数指针,调用compare函数

2.qsort函数怎么使用

  • qsort函数的实现原理还是运用了函数指针来实现的。运用了回调函数。
  • 戳链接,见上一篇博客回调函数的介绍《函数指针的应用
  • qsort库函数按升序排序整型方法如下。
#include<stdlib.h>
#include<stdio.h>
//第二步,比较
int cmp(const void* e1, const void* e2)
{
	//只需要我们写一个这样的比较函数就可以了
	return *(int*)e1 - *(int*)e2;
}
//第三步,打印
void Print(int* arr, int num)
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		printf("%d ", *(arr + i));
	}
}
//第一步,主函数调用qsort函数
int main()
{
	int arr[] = { 5,4,3,2,1 };
	int num = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, num, sizeof(arr[0]), cmp);
	Print(arr, num);
	return 0;
}

3.用冒泡排序模拟qsort函数来排序任何数据类型。

(1)冒泡排序算法。

下面这个普通的冒泡排序代码来排序整型数组。但这个冒泡排序比较局限,只会用来排序整型。现在怎么把它变为通用的排序算法,让它成为万能的排序模板呢?接下来函数指针就登场了~

#include<stdio.h>
void Bubble(int* arr, int sz)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int t = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = t;
			}
		}
	}
}
void Print(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = { 5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Bubble(arr, sz);//排序
	Print(arr, sz);//打印
	return 0;
}

(2)模仿qsort函数的用法,写成一个函数指针。

通过我的经验。会发现,现在的问题是假如现在需要比较字符串的话,那么红色方框里的方法已经不适合,应该用strcmp函数。所以要把这一部分单独抽出来,利用指针按照实际情况去调用我们需要的比较函数。
在这里插入图片描述 整体代码

/*qsort函数冒泡排序模拟*/
#include<stdio.h>
int cmp(const void* e1, const void* e2)
{
	return *(char*)e1 - *(char*)e2;
}
void swap(char* x, char* y, int base)
{
	int i = 0;
	for (i = 0; i < base; i++)
	{
		char t = 0;
		t = *x;
		*x = *y;
		*y = t;
		x++;
		y++;
	}
}
void Bubble(int* arr, int sz, int base, int (*p)(const void* e1, const void* e2))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz-1-i; j++)
		{
			if (p((char*)arr+j*base, (char*)arr+(j+1)*base)>0)
			{
				swap((char*)arr + j * base, (char*)arr + (j + 1) * base, base);
			}
		}
	}
}
void Print(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = { 5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Bubble(arr, sz, sizeof(arr[0]),cmp);
	Print(arr, sz);
	return 0;
}

4.❤️整体实现逻辑(画图分析)

(1)调用bubble函数,将四个实参分别穿给形参

在这里插入图片描述

(2)通过函数指针p调用比较函数。

在这里插入图片描述

(3)调用swap函数。实现数据类型的逐个字节的交换

在这里插入图片描述在这里插入图片描述

(4)最后打印显示

在这里插入图片描述

  • 67
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 70
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 70
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔 巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值