用冒泡排序模拟实现qsort

在学习使用过qsort之后,一直在想是否能用其他的排序算法去模拟实现它的功能,把自己的实现写出来,也是对自己的一种总结吧。


因为模拟是实现qsort,实现原理与qsort基本相同所以,给出和它一样的参数列表。

void BubbleSortNoType(void *arr, int dataNum, int typeSize, Fun fun)//数组地址,元素个数,元素类型大小,比较函数

typedef int(*Fun)(void *, void *);

void BubbleSortNoType(void *arr, int dataNum, int typeSize, Fun fun)
{
	if (NULL == arr)
	{
		return;
	}
	int idx = 0;
	int jdx = 0;
	for (idx = 0; idx < dataNum - 1; idx++)
	{
		int Ischange = 0;//避免无用循环

		for (jdx = 0; jdx < dataNum - idx - 1; jdx++)
		{
			//内部一个字节一个字节的处理
			char* FirValue = (char *)arr + jdx * typeSize;
			char* SecValue = (char *)arr + (jdx + 1) * typeSize;
			if (fun(FirValue, SecValue))
			{
				int x = typeSize;
				while (x)
				{
					char tmp = *FirValue;
					*FirValue = *SecValue;
					*SecValue = tmp;
					FirValue++, SecValue++;
					x--;
				}
				Ischange = 1;
			}
		}
		if (!Ischange)
		{
			break;
		}
	}
}

int Great(void *left, void *right)//比较函数的一个例子
{
	return *((char *)left) >= *((char *)right);
}

测试实例:

int GreatChar(void *left, void *right)//比较函数
{
	return *((char *)left) >= *((char *)right);
}

int GreatInt(void *left, void *right)//比较函数
{
	return *((int *)left) >= *((int *)right);
}

int GreatDouble(void *left, void *right)//比较函数
{
	return *((double *)left) >= *((double *)right);
}
int main()
{
	char array[] = "gfedcba";
	Fun fun = GreatChar;
	BubbleSortNoType(array, strlen(array), sizeof(array[0]), fun);

	int arrayint[] = { 1, 9, 3, 0, 5, 7, 6, 8, 2, 4, 4, 5, 6 };
	fun = GreatInt;
	BubbleSortNoType(arrayint, sizeof(arrayint) / sizeof(arrayint[0]), sizeof(arrayint[0]), fun);

	double arraydouble[] = { 1, 2.1, 5.4, 5.6, 5.8, 4.3, 6.9, 1.5, 9.9 };
	fun = GreatDouble;
	BubbleSortNoType(arraydouble, sizeof(arraydouble) / sizeof(arraydouble[0]), sizeof(arraydouble[0]), fun);
	system("pause");
	return 0;
}


排序成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值