关于qsort

我们先说一下回调函数

函数指针是一种类型,他可以定义变量,可以作为函数形参。

概念:通过函数指针调用的函数。把函数指针(地址)作为参数传递给另一个函数,当这个指针被用来调其所指向的函数时,我们就称之为回调函数

通俗的说就是函数里面在满足一定条件的时候就调用参数里面的函数

下面我们也说说qsort:

功 能: 使用快速排序例程进行排序

原型:void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

第一个参数:待排序数组首地址

第二个参数:数组中待排序元素数量

第三个参数:每个元素占用空间的大小

第四个参数:指向函数的指针,用于确定排序的顺序(传入一个特定类型的比较函数的方法)

(由于是void型的,所以我们要自己来写一个方法:int char ....)

看看这个代码:

//int cmp_int(void *x, void *y)  //void *可以定义变量,但当我们想来比较两个值的时候就会*,
   //这时就会成为void ,不可定义变量,所以此时我们对此进行强转为我们所比较的类型
   int cmp_float(void *x, void *y)
{
	/*int *_x = (int *)x;
	int *_y = (int *)y;*/
	   int *_x = (float *)x;
	   int *_y = (float *)y;
	if (*_x > *_y)
	{
		return 1;
	}
	else if (*_x < *_y)
	{
		return -1;
	}
	else
		return 0;
}
int main()
{
	//int arr[] = { 1, 2, 4, 6, 2, 7, 9, 0, 7 };
	/*int size = sizeof(arr) / sizeof(arr[0]);*/
	//qsort(arr, size, sizeof(int), cmp_int);
	float arr[] = { 3.2, 2.3, 8.0, 6.7 };
	int size = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, size, sizeof(float), cmp_float);
	system("pause");
	return 0;
}
int cmp_string(const void *str1, void *str2)
{
	return strcmp((char *)str1, (char *)str2);
}
int main()
{
	//int arr[] = { 1, 2, 4, 6, 2, 7, 9, 0, 7 };
	/*int size = sizeof(arr) / sizeof(arr[0]);*/
	//qsort(arr, size, sizeof(int), cmp_int);
	/*float arr[] = { 3.2, 2.3, 8.0, 6.7 };
	int size = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, size, sizeof(float), cmp_float);*/
	char arr[3][4] = { "qaa", "bsb", "exe" };
	int size = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, size, sizeof(arr[0]), cmp_string);
	int i;
	for (i = 0; i < 3; i++)
	{
		printf("%s\n", arr[i]);
	}
	system("pause");
	return 0;

1.整形


2.浮点型


3.字符串


qsort本身与类型无关,但是我们自己写的比较方法是必须与类型有关的。

那么我们来自己实现一下这个函数,看看代码吧~

  void swap(char *x,char *y ,int size)
   {
	   while (size--)
	   {
		   *x ^= *y;
		   *y ^= *x;
		   *x ^= *y;
		   x++;
		   y++;
	   }
   }
void my_qsort(void *arr, int num, int size, int(*cmp)(void *, void *))
{
	assert(arr);
	assert(cmp);
	int i = 0;
	int j = 0;
	int flag = 0;
	for (i = 0; i < num-1; i++)
	{
		for (j = 0; j < num - 1 - i; j++)
		{
			if (cmp((char *)arr + j*size, (char *)arr + (j + 1)*size)>0)
			{
				flag == 1;
				swap((char *)arr + j*size, (char *)arr + (j + 1)*size, size);   //数据进行交换,由于不知道类型,所以我们采用字节交换的方法
			}
		}
		if (flag == 0)
		{
			break;
		}
	}

}
int main()
{
	//int arr[] = { 1, 2, 4, 6, 2, 7, 9, 0, 7 };
	/*int size = sizeof(arr) / sizeof(arr[0]);*/
	//qsort(arr, size, sizeof(int), cmp_int);
	float arr[] = { 3.2, 2.3, 8.0, 6.7 };
	int size = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, size, sizeof(float), cmp_float);
	system("pause");
	return 0;
}


猜你喜欢

转载自blog.csdn.net/z_juan1/article/details/80420060
今日推荐