理解回调函数,模仿 qsort 的功能实现一个通用的冒泡排序,并使用qsort函数排序各类型数据

回调函数:

      回调函数就是一个通过函数指针调用的函数,把函数的指针(地址)作为参数传递到另一个函数,当这个指针被用来调用其所指向的函数时,成为回调函数。

      回调函数不是由该函数的实现方直接调用,,而是在事件或条件发生时由另一方调用。

      回调函数就是函数指针的一种用法。

你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。

大神链接:
链接:https://www.zhihu.com/question/19801131/answer/13005983
来源:知乎
 

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

#include<stdio.h>
#include<stdlib.h>

int cmp(const void *p1, const void *p2)
{
	return (*(char*)p1 - *(char*)p2);
}

void _swap(void *p1, void *p2, int size)
{
	int i = 0;
	for (i = 0;i < size;i++)
	{
		char tmp = *((char *)p1 + i);
		*((char *)p1 + i) = *((char *)p2 + i);
		*((char *)p2 + i) = tmp;

	}
}

void bubble(void *base, int count, int size, int(*cmp)(void *, void *))
{
	int i = 0;
	int j = 0;
	for (i = 0;i < count - 1;i++)
	{
		for (j = 0; j < count - i - 1;j++)
		{
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				_swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}//(char*)base + j * size为a[j],(char*)base + (j + 1) * size为a[j + 1]
		}
	}
}

int main()
{
	int arr[] = { 1, 3, 6, 7, 9, 8, 2, 4, 5 };
	int i = 0;
	bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp);//cmp回调函数
	for (i = 0;i < sizeof(arr) / sizeof(arr[0]);i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");

	//char arr1[] = { 'aaa','ccc','ZZZ','YYY' };
	char arr1[] = { 'a','c','Z','Y' };
	bubble(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), cmp);//cmp回调函数
	for (i = 0;i < sizeof(arr1) / sizeof(arr1[0]);i++)
	{
		printf("%c ", arr1[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}

void *则为“无类型指针”,void *可以指向任何类型的数据,在使用时也需要按照对应的类型进行强制转换。

使用qsort函数排序各类型数据:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int cmp1(const void *x, const void *y)
{
	return (*(int*)x - *(int*)y);
}

int cmp2(const void *x, const void *y)
{
	return (*(char*)x - *(char*)y);
}

int cmp3(const void *x, const void *y)
{
	return strcmp(*(char**)x , *(char**)y);
}

int cmp4(const void *x, const void *y)
{
	return (*(double*)x - *(double*)y);
}

int main()
{
	int i = 0;
	//整形数组
	int arr1[] = { 1,6,9,24,5 };
	qsort(arr1, sizeof(arr1)/sizeof(arr1[0]), sizeof(arr1[0]), cmp1);
	for (i = 0;i < sizeof(arr1) / sizeof(arr1[0]);i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");

	//字符数组
	char arr2[] = { 'a','c','d','b','W','F','Z','Y' };
	qsort(arr2, sizeof(arr2) / sizeof(arr2[0]), sizeof(arr2[0]), cmp2);
	for (i = 0;i < sizeof(arr2) / sizeof(arr2[0]);i++)
	{
		printf("%c ", arr2[i]);
	}
	printf("\n");

	//字符串
	char *arr3[] = { "aaa","ddd","vvv","bbb" };
	qsort(arr3, sizeof(arr3) / sizeof(*arr3), sizeof(*arr3), cmp3);
	for (i = 0;i < sizeof(arr3) / sizeof(*arr3);i++)
	{
		printf("%s ", arr3[i]);
	}
	printf("\n");

	//浮点数
    double arr4[] = { 1.2 ,6.0 ,24.1 ,5.0 };
	qsort(arr4, sizeof(arr4) / sizeof(arr4[0]), sizeof(arr4[0]), cmp4);
	for (i = 0;i < sizeof(arr4) / sizeof(arr4[0]);i++)
	{
		printf("%f ", arr4[i]);
	}
	printf("\n");

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/W_J_F_/article/details/81384604
今日推荐