qsort模拟实现

模仿qsort的功能实现一个通用的冒泡排序。

代码如下:

#define  _CRT_SECURE_NO_WARNINGS
#include

void print(void* arr,size_t n)//实现数组的打印
{
	for (int i = 0; i < n; i++)
	{
		printf("%3d", *((int*)arr + i));
	}
}

int cmp_int(const void* p1, const void* p2)//判断前后两数的大小关系
{
	return *((int*)p1) - *((int*)p2);//前>后,则返回一个大于0的数
}

void swap_my(char* p1,char*p2,size_t n )//实现前后两数的交换
{
	for (int i = 0; i < n; i++)//通过每个字节交换位置,达到元素交换数值的结果
	{
		int tmp = *(p1 + i);
		*(p1 + i) = *(p2 + i);
		*(p2 + i) = tmp;
	}
}

void bubble(void* arr,size_t num,size_t n,int (*cmp)(const void* ,const void* ))//模拟实现qsort函数
{
	for (int i = 0; i < num - 1; i++)//使用冒泡排序法
	{
		int count = 0;
		for (int j = 0; j < num - i - 1; j++)
		{
			if (cmp_int(((char*)arr) + j * n, ((char*)arr) + (j + 1) * n) > 0)
			{
				swap_my(((char*)arr) + j * n, ((char*)arr) + (j + 1) * n, n);
				count = 1;
			}
		}
		if (count == 0)//如果此轮排序没有发生交换则说明已经有序,直接退出循环
			break;
	}
	print(arr, num);
}

int main()
{
	int arr[] = { 9,3,5,7,4,34,76,43,23,98,45 };
	print(arr, sizeof(arr) / sizeof(arr[0]));
	printf("\n排序后的结果为\n");
	bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_int);
	return 0;
}

运行结果:

qsort模拟实现_第1张图片

你可能感兴趣的:(算法,数据结构,c语言)