调用(快速)排序函数

本文详细介绍了C++中的库函数qsort(),用于对不同类型的数据进行排序,包括整型、字符型以及结构体。通过提供自定义的比较函数指针,可以实现对结构体中特定字段的排序。同时,文中还展示了如何实现升序和降序排序,并给出了结构体排序的示例。此外,还讲解了如何根据结构体成员对结构体数组进行排序,如按年龄或姓名排序。
摘要由CSDN通过智能技术生成

库函数中有个函数叫快速排序函数的东西

它能对结构体排序、整形、字符等类型进行排序

在Cplusplus中讲述的是:

void qsort (void* base, size_t num, size_t size,
                  int (*compar)(const void*,const void*));

这是这个函数的格式

接下来是参数解释:

void* base : 从哪开始,一般指的是数组名

size_t num : 指的是元素个数。

size_t size : 指的是单个元素的类型(字节)。

int (*compar)(const void*,const void*) : 函数指针,数组中两个元素交换的类型

函数指针判断的是这两个元素相减是 >0 or =0 or <0

是根据这个排序

它的一般格式是:

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

int* 对应的是数组元素类型为int

如果是char,那么就要将e1和e2强制类型转换为char*,再将它们的差值返回。

调用函数

qsort(arr, sz, sizeof(arr[0]), cmp_int);

完整代码

#include <stdio.h>
#include <stdlib.h>
int print(int* arr, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(arr + i));
	}
	printf("\n");
}
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[10] = { 89,65,32,45,78,12,30,26,85,74 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print(arr, sz);
}

补充1 : 对结构体的排序

设定一个结构体为

struct stu
{
	char name[20];
	int age;
};
int main()
{
    struct stu s[3] = { {"zhangsan",40},{"lisi",28},{"wangwu",21}};
}

结构体排序需要指明是对结构体中的那个元素排序,

故它的函数指针应该填:

年龄

int sort_by_age(const void* e1,const void* e2)
{
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
    //注意   结构体指针 ->(指向) 结构体成员
}

名字

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

注意 strcmp 是专门对付字符串比较的,记得引头文件<string.h>

比较的是字符串首字母的ASCII码值

整体代码


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu   //定义结构体
{
	char name[20];
	int age;
};

int print(int* arr, int sz)   //数组打印函数
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(arr + i));
	}
	printf("\n");
}

int sort_by_age(const void* e1,const void* e2) //按年龄比较的函数指针
{
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
int sort_by_name(const void* e1, const void* e2)//按名字比较的函数指针
{
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
    //strcmp 如果两个字符串相等返回0  如果字符串1大于字符串2 则返回1,否则返回-1
}

int main()
{
	struct stu s[3] = { {"zhangsan",40},{"lisi",28},{"wangwu",21}};
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), sort_by_name);
	printf("%s %s %s", s[0].name, s[1].name, s[2].name);
}

补充2:升序降序

qsort可以实现升序和降序,方法就是指针函数上

举例就用整形排序来说

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

若使用   *(int*)e1 - *(int*)e2 

那么就会进行qsort特定的排序

实现小的数在前面,大的数在后面

实现升序

若用    *(int*)e2 - *(int*)e1

那么qsort特定的排序

就会把大的数放前面,小的数放后边

实现降序

例:

升序

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

 降序

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

结构体雷同。

本人语言水平不行,若有说错的地方,敬请指出!!多谢!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值