回调函数qsort

回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数,传给

另一个函数,当这个指针被用来调用其所指向的函数时,我们说这就是回调函数。回调函数不由

该函数的实现方式直接调用,在特定条件下由另外的一方调用,用于对该事件或者该条件进行相应。

qsort 快速排序库函数void qsort (void* base, size_t num, size_t size,

            int (*compar)(const void*,const void*));

第一个参数待排序数组的首元素的地址,第二个参数待排序数组元素的个数

第三个参数是待排序的每个元素的大小单位是字节,第四个参数是函数指针,比较两个元素使用函数的地址,

函数自己定义,里面两个参数为待比较两个元素地址

void*指针可以接收任意类型地址,但是不能解引用,解引用没具体类型不能知道访问几个字节

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{
	char name[20];
	int age;
};
//int cmp_int(const void* e1, const void* e2)
//{
//	return *(int*)e1 - *(int*)e2;
//}int cmp_float(const void* e1, const void* e2)
//{
//	return (int)*(double*)e1 - *(double*)e2;
//}int cmp_stu_by_age(const void* e1, const void* e2)
//{
//	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
//}
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
//	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}
//void test1()
//{
//	int a[] = { 9,8,7,6,5,4,3,2,1,0 };
//	int sz = sizeof(a) / sizeof(a[0]);
//	qsort(a, sz, sizeof(a[0]), cmp_int);
//	int i;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", a[i]);
//	}
//	printf("\n");
//}
//void test2()
//{
//	double f[] = { 9.0,6.6,5.5,3.3,2.1};
//	int sz = sizeof(f) / sizeof(f[0]);
//	qsort(f, sz, sizeof(f[0]), cmp_float);
//	int i;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%lf ", f[i]);
//	}
//	printf("\n");
//}
//void test3()
//{
//	struct Stu s[3] = { {"张三",30},{"李四",27},{"王五",25} };
//	int sz = sizeof(s) / sizeof(s[0]);
//	//qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
//	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
//	int i;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", s[i].age);
//		printf("%s ", s[i].name);
//	}
//	printf("\n");
//}
//int main()
//{
//	test1();
//	test2();
//	test3();
//}

这是回调函数的使用,函数里面的实参是一个自己写的函数指针

下面自己写这个快速排序函数

int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
void swap(char* buf1, char* buf2, int width)
{
	int i = 0;
		for (i = 0; i < width; i++)
		{
			char t = *buf1;
			*buf1 = *buf2;
			*buf2 = t;
			buf1++;
			buf2++;
		}
}
void bubble_sort(void* base, int sz, int width,int(*cmp)(const void*e1,const void*e2))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base + j * width, (char*)base + (j + 1)*width)>0)
			{
				swap((char*)base + j * width, (char*)base + (j + 1)*width, width);
			}
		}
	}
}
int main()
{
	struct Stu s[3] = { {"zhang",23},{"li",21},{"wang",20} };
	int sz = sizeof(s) / sizeof(s[0]);
	bubble_sort(s,sz,sizeof(s[0]),cmp_stu_by_name);
	int i;
	for (i = 0; i < 3; i++)
	{
		printf("%d ", s[i].age);
		printf("%s ", s[i].name);
	}
}

这就是函数的实现,排序很多类型的数

上一篇:Qsort 与 生成随机验证集【C语言】


下一篇:C库函数qsort()函数用法