C语言快速排序的具体实现(适用于任何数据类型)

本文详细介绍了标准库函数qsort的具体使用方法,包括其参数说明、比较函数的实现方式,并提供了针对不同类型数据的示例代码。此外,还展示了qsort的一种内部实现思路,有助于读者深入理解并灵活运用这一强大的排序工具。

一、qsort具体使用

1.库函数

<stdlib.h> and <search.h>

2.参数

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );


1.base是指向一个数组的指针
2.num 是该数组的元素个数
3.width是每一个元素单独在空间所占字节大小
4.最后一个为函数指针类型,该函数指针 指向返回值为int类型,2个参数都为void类型的指针的函数。

3 .compare的实现

想简单使用快速排序qsort ,compare函数必须由使用者本身来具体实现,因为qsort的创作者并不了解你所排序的数据是什么类型的。

以数据类型为int为例

int compare(void* p1,void*p2)
{
	return *((int*)p1) - *((int*)p2);//
}

字符串为例

int compare(void* p1,void*p2)
{
	return strcmp((char*)p1,(char*)p2);
}

具体使用如下:

#include <stdio.h>
#include<stdlib.h>
int cmp(const void* p1,const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}
int main()
{
	int arr[10] = { 1,5,2,3,4,9,6,7,8,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp);
	
}

二、qsort具体内部实现

直接上代码:

#include <stdio.h>
#include<stdlib.h>
int cmp(const void* p1,const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}
void swap(char* p1, char* p2,int width)
{
	int i = 0;
	while (i < width)
	{
		char tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		i++;
		p1++;
		p2++;
	}
}
void Myqsort(void* base, int sz, int width, int (*cmp)(const void*, const void*))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base + j * width, (char*)base + (j+1) * width)>0)
			{
				swap((char*)base + j * width, (char*)base + (j+1)* width,width);
			}
		}
	}


}
int main()
{
	int arr[10] = { 1,5,2,3,4,9,6,7,8,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Myqsort(arr, sz, sizeof(arr[0]), cmp);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	
}

总结

qsort可用来排序任何类型的数据,能熟练使用qsort对我们刷题很有帮助,简单又方便!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

1无名之辈1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值