写一个自己的qsort函数

先写出排序int型的排序代码

平时我们最常接触的就是一个数组的排序,我们以int型为例,要把arr={10,9,8,7,6,5,4,3,2,1}这个数组中的数字以升序排列,我们就要用到一系列的排序方法,本篇文章采用冒泡排序。冒泡排序的原理大致为让相邻两个数做比较,如果不符合大小就交换。如下图所示:

这样我们就可以写出函数的代码

void bubble_sort(int* arr, int sz)
{
	for (int i = 0; i < sz - 1; i++)//循环sz-1次
	{
		for (int j = 0; j < sz - 1 - i; j++)//内部循环sz-1-i次
		{
			if (arr[j] > arr[j + 1])//比较两个数的大小,如果不符合该有的大小就交换位置。
			{
				int tem = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tem;
			}
		}
	}
}

我们使用以下此函数运行以下会发现数组的顺序改为了升序

写到这里我们思考,如果数组不是int型是double型呢?我们是否还要写一个double型的冒泡排序?这未必也太麻烦了,不同类型的数组用不同类型的排序将让代码显得冗杂,并且我们写代码写的也麻烦,所以我们想是否要写一个通用的排序算法来排序各种类型的数据。

写出通用的排序代码bubble_sort

我们先看原本的函数定义:

void bubble_sort(int* arr, int sz)

函数定义了一个整形指针变量(代表要排序数组的首地址)和一个整形变量(代表数组长度)。到时候我们传入的将不一定是整形类型的数组而可能是别的类型数组,所以我们将参数改变成可以接收所有类型的指针void*。

void bubble_sort(void* arr, int sz)

接下来我们看代码的内容:

for (int i = 0; i < sz - 1; i++)//循环sz-1次
{
	for (int j = 0; j < sz - 1 - i; j++)//内部循环sz-1-i次
	{
		if (arr[j] > arr[j + 1])//比较两个数的大小,如果不符合该有的大小就交换位置。
		{
			int tem = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = tem;
		}
	}
}

如上图所示我们只要改变原冒泡排序中下面两个箭头所指向的代码就好了,但是我们并不知道它要我们排序什么类型的数组,所以我们需要知道这个类型数组中元素的大小,并且我们需要使用函数者提供一个判断函数是否交换位置的函数,返回类型为int。所以我们要扩充一下函数参数的内容,将他改变如下:

void bubble_sort(void* arr, size_t sz,size_t size,int(*cmp)(const void *p1,const void*p2))

然后按照上面的参数,我们改变代码。首先是判断是否将这两个元素交换位置。在函数参数中我们使用了函数指针cmp,我们在这个位置调用它,又因为void*类型的指针无法加减数字,所以为了使步数为一,我们将参数转化为char*类型。那我们如何判断函数要往后移多少步呢?我们参考以下图片:

那我们就把第一部分要改的函数改成

if (cmp((char*)arr+j*size, (char*)arr + (j+1 )* size)>0)//比较两个数的大小,如果不符合该有的大小就交换位置。

第二部分我们要交换位置,方法用图片表达大致如下:

为了让函数看起来不要太冗杂,我们再次封装一个换位函数swap。

void swap(char* p1, char* p2,size_t size)
{
	int i;
	for (i = 0; i < size; i++)
	{
		char tem = p1[i];
		p1[i] = p2[i];
		p2[i] = tem;

	}
}

这样我们再调用它整个通用的冒泡排序就写好啦!!以下是整个冒泡排序代码:

}
void bubble_sort(void* arr, size_t sz,size_t size,int(*cmp)(const void *p1,const void*p2))
{
	for (int i = 0; i < sz - 1; i++)//循环sz-1次
	{
		for (int j = 0; j < sz - 1 - i; j++)//内部循环sz-1-i次
		{
			if (cmp((char*)arr+j*size, (char*)arr + (j+1 )* size)>0)//比较两个数的大小,如果不符合该有的大小就交换位置。
			{
				swap((char*)arr + j * size, (char*)arr + (j + 1) * size,size);
			}
		}
	}
}

我们排序一下整形和结构体试试。

可以见得我们代码写的很成功!!!

本人刚开始接触代码没多久,哪里有错误请各位大佬多多包含指正,喜欢的话就关注我以下哦,谢谢各位啦!!!

  • 36
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值