模拟实现qsort函数

1.qsort函数是函数库中自带的排序函数(从小到大排序),头文件

2.声明:void qsort(void* base,size_t num,size_t width,

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

(1):base:指向排序数组中的第一个元素的指针。

(2):num:数组中的元素个数.

(3):width:数组中每个元素的大小,以字节为单位。

(4):compar:作用是用来比较2个元素,即函数指针(回调函数),参数为2个(viod*)类型

3.回调函数:通过函数指针调用的函数,如果把函数的地址作为参数传递给另一个函数,

当这个指针被用来调用其所指向的函数时,可称为回调函数

4.int compar(const void *e1,const void* e2);

(1)如果compar返回值小于0,那么e1所指向的元素小于e2所指向的元素,不发生交换

(2)如果compar返回值等于0,那么e1所指向的元素等于e2所指向的元素,不发生交换

(3)如果compar返回值大于0,那么e1所指向的元素大于e2所指向的元素,发生交换

5.模拟实现qsort函数

#include 
#include
void swap(char* e1, char* e2, int width)//以每个字节进行交换
{
	for (int i = 0; i < width; i++)
	{
		char tmp = *e1;
		*e1 = *e2;
		*e2 = tmp;
		e1++;
		e2++;
	}
}
int cmp_int(const void* e1, const void* e2)//比较大小,以返回值判断是否进行交换
{
	return (*(int*)e1 - *(int*)e2);
}
void My_qsort(void* arr, 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 - i - 1; j++)
		{
			if (cmp((char*)arr + j * width, (char*)arr + (j + 1) * width)>0)
			{
				swap((char*)arr + j * width, (char*)arr + (j + 1) * width, width);
			}
		}
	}
}
void print(int* arr, int sz)//对排序完成的数组进行打印
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	My_qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print(arr, sz);
	return 0;
}

6.使用qsort函数排序各种类型

#include
#include
#include
struct stu
{
	int age;
	char name;
	double score;
};
//int类型判断
int cmp_int(const void* e1, const void* e2)
{
	return (*(int*)e1 - *(int*)e2);
}
//float类型判断
int cmp_float(const void* e1, const void* e2)
{
	//return (int)(*(float*)e1 - *(float*)e2);丢失数据,结果错误
	return *(float*)e1 > *(float*)e2 ? 1 : -1;
}
//结构体(int)类型判断
int cmp_struct_age(const void* e1, const void* e2)
{
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
//结构体(char)类型判断
int cmp_struct_name(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
//结构体(double)类型判断
int cmp_struct_score(const void* e1, const void* e2)
{
	return ((struct stu*)e1)->score > ((struct stu*)e2)->score ? 1 : -1;
}
//打印int类型数组
void print1(int* arr1, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
}
//打印float类型数组
void print2(float* arr2, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%.1f ", arr2[i]);
	}
	printf("\n");
}
void test1()
{
	int arr1[] = {1,2,3,1,3,4};
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	qsort(arr1, sz, sizeof(arr1[0]), cmp_int);
	print1(arr1, sz);
}
void test2()
{
	float arr2[] = {3.8,2.3,7.7,3.9,1.9};
	int sz = sizeof(arr2) / sizeof(arr2[0]);
	qsort(arr2, sz, sizeof(arr2[0]), cmp_float);
	print2(arr2, sz);
}
void test3()
{
	struct stu arr3[3] = { {"lin",18,5.20},{"qin",19,3.80},{"yan",20,2.50} };
	int sz = sizeof(arr3) / sizeof(arr3[0]);
	qsort(arr3, sz, sizeof(arr3[0]), cmp_struct_age);
	qsort(arr3, sz, sizeof(arr3[0]), cmp_struct_name);
	qsort(arr3, sz, sizeof(arr3[0]), cmp_struct_score);
}
int main()
{
	test1();//int类型
	test2();//float类型
	test3();//结构体类型
	return 0;
}

你可能感兴趣的:(c语言)