C语言模拟qsort函数

注意;

这里模拟是用冒号排序实现,qsort是用快速排序实现排序

简单介绍一下qsort含数

qsort是stdlib.h中的函数,因此使用前需要声明:

qsort函数包含四个参数,分别是:

1.数组名

2.元素个数(从前往后计算)

3.数组元素所占字节(int,double,char等所占字节)

4.排序原则


qsort(num, n, sizeof(int), cmp);

模拟qsort函数

好,那我们模拟它就从这四个参数下手,顺便补充一下,排序原则是返回正负数来判断元素大小的

#include<stdio.h>
float cmp(const void* p1, const void* p2)//有什么需求就写相对应类型的函数
{
	return *(float*)p1 - *(float*)p2;//因为你参数为void*类型,所以需要强制转换你所需类型
}
	void Swap(char* pa1, char* pa2, size_t wide)//交换元素的函数
	{
		size_t i;
		for (i = 0; i < wide; i++)//一个一个字节慢慢换
		{
			char tem = *pa2;
			*pa2 = *pa1;
			*pa1 = tem;
			pa1++;
			pa2++;
		}
	}
	//size_t意思是无符号整形
void qsort_t(void*arr, size_t sz,size_t wide, float cmp(const void*,const void*))//void*就像垃圾桶,什么类型都能接收
{
	size_t i= 0;
	size_t j;
	for ( i = 0; i < sz; i++)
	{
		for (j = 0; j < sz - 1; j++)//这里核心是wide用法,好比你传进来是int arr[0]是4个字节
			//但我把你转换成一个字节类型(char)的指针乘以arr[0]的宽度4
			// 那么解引用(char*)arr + j * wide的地址依旧是arr[0]的元素,j=0
			//为什么要转换,因为我们要用多种类型,如果不这样做,那运用范围就小了
		{
			if (cmp((char*)arr + j * wide, (char*)arr + (j+1) * wide )<0)//判断返回值大小
			{
				Swap((char*)arr + j * wide, (char*)arr + (j + 1) * wide,wide);
			}
		}
		
	}
}

int main()
{
	float arr[] = { 3.10,2.80,4.60,1.10,5.50 };
	size_t sz = sizeof(arr) / sizeof(arr[0]);
	size_t wide = sizeof(arr) / sz;
	qsort_t(arr, sz, wide, cmp);
	for (size_t p = 0; p < sz; p++)
	{
		printf("%f ", arr[p]);
	}
	
    return 0;
}

这里用两组不同类型数组测试了下

效果看来没问题

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值