0
点赞
收藏
分享

微信扫一扫

qsort的模拟实现

霍华德 2022-01-18 阅读 55

原型:msdn中介绍qsort是用快去排序实现,我们这里使用冒泡排序实现。

qsort(void*base,size_t length,size_t width,int(*cmp)(void *e1, void *e2));

(void *指针像一个垃圾桶什么都可以往里面装。)

base:需要被排序的数组起始地址;

length:需要被排序的数组的长度;

width:需要被排序数组的每一个元素所占字节数;

cmp函数:用户自定义排序类型函数;

实现主体部分:以整形数组为例

qsort部分:

void qsort(void* arr, int sz, int width, int (*cmp)(void* e1, void* e2))
{
	int i = 0, j = 0;
	for (i = 0; i < sz; i++)
	{
		for (j = 0; j < sz - i - 1; j++)
		{
			if (cmp(((char*)arr) + j * width,((char*)arr) + (j + 1) * width)>0)
			{
				swap(((char*)arr) + j * width ,((char*)arr) + (j + 1) * width,width);
			}
		}
	}
}

重点:为什么要强转为字符指针类型?

1.void指针类型是个垃圾桶什么都能装,+1个步长不知道跳过多少个字节数,所以不行

2.char类型指针每次跳过一个字节数,这时候宽度就派上了用场,+j*width就可以跳过每个元素所占字节数大小,正好可以比较相邻的元素

swap部分:

void swap(char* p1, char* p2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char t = *p1;
		*p1 = *p2;
		*p2 = t;
		p1++; p2++;
	}
}

 这时候宽度有派上了用场,我们可以把每个数据一个字节一个字节的交换,这样就能实现整体交换了!!!!

自定义cmp示例:

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

cmp是用户自定义类型,所以强转可以用户来实现了。

主函数部分:

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

运行结果:

 这样一个排序就写好了,同理这个可以对结构体进行排序,只需要自定义的cmp改成结构体指针就好了

举报

相关推荐

0 条评论