【C语言】重要函数qsort函数的用法

目录

          一、qsort函数的介绍

                1、整形数组

                2、字符数组

                3、字符串

                4、结构体

          二、qsort函数的使用


一、qsort函数的介绍

qsort函数是一种底层快速排序的函数,它的特点就是可以排序任意类型的数据,比如:整形、字符串、浮点型、以及结构体类型。

具体用法如下:

1、void* base:表示待排序数组的起始地址;

2、size_t  num:表示数组元素的个数;

3、size_t  size:表示一个数组元素的大小(单位字节);

4、int  (*compar)(const void*, const void*):表示比较两个元素大小的函数指针,指向的函数是排序函数,所包含的两个参数为比较元素的地址,最后参数的类型为void*,这样可以接收任意形式的参数。 

1、整形数组

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

上述函数是自定义的比较函数,函数的返回类型为 int 类型,如果<0时,e1小于e2,如果>0时,e1大于e2,如果=0时,e1=e2。对两个元素指针进行强制类型转化为整型指针,再进行解引用得到比较元素的值,最后将两个元素的差值返回。

2、字符数组

int cmp_char(const void* e1, const void* e2)
{
	return *(char*)e1 - *(char*)e2;
}

3、字符串

 (1)按字符串首字母进行排序

int cmp_string(const void* e1, const void* e2)
{
	return *(char*)e1 - *(char*)e2;
}

 (2)按字符串长度进行排序

int cmp_string(const void* e1, const void* e2)
{
    return strlen((char*)e1) > strlen((char*)e2) ? 1 : -1;
}

4、结构体

假如结构体如下:

struct Stu
{
   char name[20];//姓名
   int age;//年龄
}s;

 (1)按名字排序

int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}

 (2)如果名字相同,就按年龄排序

int cmp_stu_by_age(const void* e1, const void* e2)
{
	if ((strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name)) != 0)
		return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
	else
		return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

二、qsort函数的使用

1、对整形数组元素的排序使用

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[10] = { 5,7,9,3,1,6,2,4,0,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

运行结果:

2、 对结构体比较的使用

struct Stu
{
	char name[20];
	int age;
};
int cmp_stu_by_name(const void* e1, const void* e2)
{
	if ((strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name)) != 0)
		return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
	else
		return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int main()
{
	struct Stu s[] = { { "zhangsan", 20 }, { "wangwu", 18 }, { "zhaohu", 50 }, { "lisi", 44 }, { "mahan", 33 }, {"zhaohu",67} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d\n", s[i].name, s[i].age);
	}
	return 0;
}

运行如下:


本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。

 老铁们,记着点赞加关注哦!!!  

猜你喜欢

转载自blog.csdn.net/m0_63198468/article/details/128400798