利用冒泡排序和函数指针实现自己的qsort函数

我们知道,qsort函数共有四个参数,分别是

1.要排序的数组

2.数组的大小

3.数组内每个元素的大小

4.排序方式函数

综上可写出主函数,如下图所示:

int main()
{
	int arr[10] = { 3,4,5,6,7,8,9,1,2,0 };
    int i = 0;
	for (i = 0; i < sz; i++)   //排序前,打印数组arr
	{
		printf("%d ", arr[i]);
	}
    printf("\n");
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr,sz,sizeof(arr[0]),cmp_int); 
	for (i = 0; i < sz; i++)     //排序完成后再次打印数组arr
	{ 
		printf("%d ", arr[i]);
	}
	return 0;
}

由于我们目前传入的数组arr为int类型的数组,故易写出排序函数如下(仅考虑从小到大排序)

int cmp_int(void* e1, void* e2)   
{
	return  *(int*)e1 - *(int*)e2;
}

 //由于无法得知传入的参数是什么类型,故参数设置为void*
//将e1和e2强制转换为(int*)类型的指针,再解引用,从而得到实际的数字,并相减
//返回的值>0时,进行冒泡排序

my_qsort函数如下所示:

void Swap(char* num1, char* num2,int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		char t = *num1;
		*num1 = *num2;
		*num2 = t;
		num1++;
		num2++;
	}
}
void my_qsort(void* base, int sz, int width, int(*cmp)(void* ,void* ))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		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);
			}
		}
	}
}

同样,由于无法确定数组元素的类型,故用void* base来接收数组
我们通过函数指针  cmp  来接收并调用排序函数
将base强制转换为(char*)类型,由于是char*类型,这时base+1表示移动一个字节,
base+width   表示移动元素大小个字节
再通过加上j*width和(j+1)*width实现元素的变换       
最后通过Swap函数交换两个元素
Swap函数需要三个参数:两个元素的地址和元素的大小
由于元素的地址是以char*类型表示的,故元素大小是多大,就要交换多少次元素  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值