C语言解读qsort函数

C语言中有一个快速排序的标准库函数 qsort ,在stdlib.h 中声明。
定义如下:

void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *));

参数解读:

  1. base是待排序数组的起始地址
  2. nelem是待排序数组的元素个数
  3. width是待排序数组的每个元素的大小单位是字节
  4. pfCompare是一个函数指针,指向一个比较函数
    比较函数

“比较函数”的原型是:int 函数名(const void * elem1, const void * elem2);该函数的两个参数,elem1 和elem2,指向待比较的两个元素。也就是说, * elem1 和* elem2 就是待比较的两个元素。

比较方法如下:

  1. 如果 * elem1 应该排在 * elem2 前面,则函数返回值是负整数(任何负整数都行)。
  2. 如果 * elem1 和* elem2 哪个排在前面都行,那么函数返回0。
  3. 如果 * elem1 应该排在 * elem2 后面,则函数返回值是正整数(任何正整数都行)。
      
    qsort 函数执行期间,需要比较两个元素哪个应在前面时,就以两个元素的地址作为参数,调用 pfCompare 函数。根据返回值大小,默认从小到大排序。如果返回值等于0,则哪个在前都行。

qsort系统调用实现

#include
int int_cmp(const void *p1, const void *p2)
{
	return (*(int *)p1 - *(int *)p2);
}
int main()
{
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	int i = 0;
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
	for (i = 0; i

qsort自己实现

#include 
#include 
#include //断言
#include //pause
//比较函数
int CompInt(const void *_xp, const void *_yp)
{
	int *xp = (int*)_xp;
	int *yp = (int*)_yp;

	if (*xp > *yp){
		return 1;
	}
	else if (*xp < *yp){
		return -1;
	}
	else{
		return 0;
	}
}
//打印函数
void Print(int *arr, int num)
{
	for (int i = 0; i < num; i++){
		printf("%d ", arr[i]);
	}
	printf("\n");
}
//字符串比较函数
int CompStr(const void *_xp, const void *_yp)
{
	char *s1 = *(char**)_xp;
	char *s2 = *(char**)_yp;

	return strcmp(s1, s2); // 1 0 -1
}
//交换
void swap(char *src, char *dst, int size)
{
	while (size){
		char temp = *src;
		*src = *dst;
		*dst = temp;
		size--;
		src++, dst++;
	}
}
//快速排序
void my_qsort(void *arr, int num, int size, int(*comp)(const void*, const void*))
{
	assert(arr != NULL);
	assert(comp != NULL);

	char *e = (char*)arr;

	for (int i = 0; i < num - 1; i++){
		int flag = 0;
		for (int j = 0; j < num - 1 - i; j++){
			if (comp(e + j*size, e + (j + 1)*size) > 0){
				flag = 1;
				swap(e + j*size, e + (j + 1)*size, size);
			}
		}

		if (flag == 0){
			break;
		}
	}
}
int main()
{
	int arr1[] = { 24, 345, 13, 45, 5, 23, 35, 856, 234, 21, 3, 45, 34, 234, 1, 4, 6 };
	int num1 = sizeof(arr1) / sizeof(arr1[0]);

	Print(arr1, num1);
	my_qsort(arr1, num1, sizeof(int), CompInt);
	Print(arr1, num1);

	char *arr2[] = { "b1234", "a1234", "4321", "abcdef" };
	int num2 = sizeof(arr2) / sizeof(arr2[0]);

	Print_Str(arr2, num2);
	my_qsort(arr2, num2, sizeof(int), CompStr);
	Print_Str(arr2, num2);


	system("pause");
	return 0;
}

你可能感兴趣的:(C语言进阶,c语言)