C语言回调函数和qsort的使用与模拟

回调函数

  简单来说:一个A函数当作参数给B函数传过去,B函数在特定的时机调用A函数,这样就被称为回调函数。
  C语言里的回调函数需要用函数指针。即就是通过一个函数指针调用的函数,如果把函数的地址作为参数传递给另一个函数,那么另一个函数通过形参的函数指针方式调用就是回调函数。

示例:

#include 
void A() {
	printf("hello world\n");
}

void B(void (*funP)()) {
	if (1) {
		funP();
	}
}

int main() {

	B(A);

	return 0;
}

qsort函数

qsort函数底层使用的是快速排序,可以排序任意类型的数据。

函数原型:void qsort( void *base, size_t num, size_t width, int (*compare )(const void *e1, const void *e2 ));

  1. void * base   排序数据的首元素地址
  2. size_t num   元素的个数
  3. size_t width  一个元素的字节大小
  4. int(*compare )(const void *e1, const void *e2 ))  比较函数,e1和e2是两个待比较的元素
    • 比较函数的返回值
      • compar返回值小于0(< 0)

      • compar返回值等于0(= 0)

      • compar返回值大于0(> 0)


qsort的使用:

示例1:

#include 
#include 

// 整型比较函数
int compare_int(const void * e1 , const void * e2) {
	return *(int*)e1 - *(int*)e2;
}

void test1() {
	int nums[] = { 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 };
	int length = sizeof(nums) / sizeof(nums[0]);
	qsort(nums , length , sizeof(nums[0]) , compare_int);
	// 打印
	for (int i = 0; i < length; i++) {
		printf("%d " , nums[i]);
	}
}

int main() {

	test1();
	// result: 1 2 3 4 5 6 7 8 9 10

	return 0;
}

示例2:

#include 
#include 
#include 

struct info {
	char name[20];
	int age;
	char sex;
};

// 字符串比较函数
int compare_str(const void * el , const void * e2) {
	return strcmp(((struct info*)el)->name, ((struct info*)e2)->name);
}

void test2() {
	struct info data[3] = {
		{"sunwukong" , 18 , 'm'},
		{"zhubajie" , 28 , 'm'},
		{"shaheshang" , 38 , 'm'}
	};
	int length = sizeof(data) / sizeof(data[0]);
	qsort(data , length , sizeof(data[0]) , compare_str);
	// 打印
	for (int i = 0; i < length; i++) {
		printf("%s\n" , data[i].name);
	}
}

int main() {

	test2();
	/*
		result:
			shaheshang
			sunwukong
			zhubajie
	*/

	return 0;
}

模拟实现qsort:


void swap(char* buffer1, char* buffer2 , int width) {
	int i = 0;
	for (i = 0; i < width; i++) {
		char temp = *buffer1;
		*buffer1 = *buffer2;
		*buffer2 = temp;
		buffer1++;
		buffer2++;
	}
}
// 冒泡排序实现
void bubble_sort(
		void * base, 
		int length,
		int width,
		int (*compare)(const void * e1 , const void * e2)
	) {
	int i = 0;
	for (i = 0; i < length - 1; i++) {
		int j = 0;
		for (j = 0; j < length - 1 - i; j++) {
			if (compare((const char*)base + j * width , (const char*)base + (j + 1)*width) > 0) {
				swap((char*)base + j * width, (char*)base + (j + 1) * width , width);
			}
		}
	}
}

你可能感兴趣的:(c语言,开发语言,学习,qsort,回调函数)