使用回调函数,模拟实现qsort(采用冒泡的方式)

回调函数就是一个通过函数指针调用的函数,如果你把函数的指针作为参数传递给另一个函数,当这个指针被用来调用其所在指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

使用回调函数,模拟实现qsort(采用冒泡的方式)


先了解qsort 的函数原型是
void qsort(void*base,   size_t num,   size_t width,    int(__cdecl*compare)(const void*,const void*));
解释:

void*base:待排序数组首元素的地址
size_t num:待排序数组的个数
size_t width :待排序数组各元素占空间大小(字节)
int(__cdecl*compare)(const void*,const void*):一个函数指针

我们通过qsort函数可以对数组,结构体,字符串等排序。

看代码:
#include<stdio.h>
#include<windows.h>
struct Stu
{
	char name[20];
	int age;
};
int cmp_str_name(const void*e1, const void*e2)
{
	return strcmp((*(struct Stu *)e1).name, (*(struct Stu *)e2).name);
}
int cmp_str_age(const void*e1, const void*e2)
{
	return (*(struct Stu *)e1).age - (*(struct Stu *) e2).age;
}
int cmp_int(const void*e1,const void*e2)
{
	return *(int*)e1 - *(int*)e2;//void*为无类型,必选先强制类型转换,才能返回值。
}
char cmp_char(const void*e1, const void*e2)
{
	return strcmp((char *)e1 , (char *)e2);
}
void jiaohuan(void *p,void *q,int kuandu)
{
	int i = 0;
	for (i = 0; i < kuandu; i++)
	{
		char tmp = *((char*)p+i);
		*((char*)p + i) = *((char*)q + i);
		*((char*)q + i) = tmp;
	}
}
void my_bubble(void *base, int geshu, int kuandu, int(*cmp)(void *, void*))//采用冒泡的方式排序。
{
	int i = 0;
	for (i = 0; i < geshu-1; i++)
	{
		int j = 0;
		for (j = 0; j < geshu - 1 - i; j++)
		{
			if (cmp((char*)base+j*kuandu,(char*)base+(j+1)*kuandu)>0)
			{
				jiaohuan((char*)base + j*kuandu, (char*)base + (j + 1)*kuandu, kuandu);
			}
		}
	}
}
void my_bubble1(void *base, int geshu, int kuandu, char(*cmp)(void *, void*))
{
	int i = 0;
	for (i = 0; i < geshu - 1; i++)
	{
		int j = 0;
		for (j = 0; j < geshu - 1 - i; j++)
		{
			if (cmp((char*)base + j*kuandu, (char*)base + (j + 1)*kuandu)>0)
			{
				jiaohuan((char*)base + j*kuandu, (char*)base + (j + 1)*kuandu, kuandu);
			}
		}
	}
}
int main()
{
	char arr2[] = "zxcvbnmlkjhgfdsaqwertyuiop";
	int str = strlen(arr2);
	my_bubble1(arr2, str, sizeof(char), cmp_char);
	printf("%s ", arr2);
	printf("\n");

	int arr[] = { 2, 1, 4, 9, 8, 6, 5, 3, 7, 0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_bubble(arr, sz, sizeof(int), cmp_int);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");

	struct Stu arr3[] = { { "wangxin", 18 }, { "bianjianxiang", 20 }, { "xuezhanpeng", 19 } };
	my_bubble(arr3, sizeof(arr3) / sizeof(arr3[0]), sizeof(arr3[0]), cmp_str_name);
	for (i = 0; i < sizeof(arr3) / sizeof(arr3[0]); i++)
	{
		printf("%s ", arr3[i].name);
	}
	printf("\n");

	my_bubble(arr3, sizeof(arr3) / sizeof(arr3[0]), sizeof(arr3[0]), cmp_str_age);
	for (i = 0; i < sizeof(arr3) / sizeof(arr3[0]); i++)
	{
		printf("%d ", arr3[i].age);
	}
	system("pause");
	return 0;
}

结果:

 
 

猜你喜欢

转载自blog.csdn.net/oldwang1999/article/details/80302719