通用的qsort逻辑

通用的qsort逻辑

#include<assert.h>
#include<string.h>
#include<stdio.h>
//int compare(const void* x_, const void* y_)
//{
//	return *((int*)x_) > *((int*)y_);
//}

int compare(const void* x_, const void* y_)
{
	/*char *x = (char*)x_;
	char *y = (char*)y_;*/
	return strcmp(  *(char**)x_, *(char**)y_);
}
void swap(void* x_, void* y_,int size)
{
	////char* x = (char*)x_;
	////char* y = (char*)x_;
	int i = 0;

	for (i = 0; i < size; i++)
	{
		*((char*)x_ + i) ^= *((char*)y_ + i);
		*((char*)y_ + i) ^= *((char*)x_ + i);
		*((char*)x_ + i) ^= *((char*)y_ + i);
	}
}
void mysqort(void *base, int sz, int size, int (*compare)(const void*, const void*))
{

	assert(base);
	//char *base_ = (char*)base;
	int i = 0;
	for (i = 0; i < sz - 1; i++)//用冒泡排序的逻辑来模拟
	{
		int j = 0, flag = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
             //调用回调函数,实现大小比较功能
			if (compare((char*)base + size * j, (char*)base + size * (j + 1)) > 0)
             //在传参时,由于强转成char*类型所以没加1,跳转一个字节,所以要加j*size(类型大小)
			{
				swap((char*)base + size * j, (char*)base + size * (j + 1),size);
				flag = 1;//设置标签,如果有进行交换flag设置成1
			}
		}

		if (flag == 0)
       //如果在一次内部循环后,flag依旧为0,则说明元素没有交换一次说明元素已经是所要排的顺序
       //环 ,直接跳出循换提高效率
		{
			break;
		}
	}
}
int main()
{
	/*int a[] = {9,8,7,6,5,4,3,2,1}*/;
	char *a[] = {"absd","bsfd","acfg","aaaa9"};

	int i = 0;
	mysqort(a, sizeof(a) / sizeof(a[0]), sizeof(int), compare);//compare 回调函数
	for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		printf("%s\n", a[i]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42139044/article/details/84260511