qsort函数的使用及模拟实现

1. C语言数据库<stdlib.h>

使用qsort函数之前必须包含该数据库

2. qsort函数的使用

2.1 qsort函数的声明 

C语言中的规定标准为:

//qsort 函数声明
void qsort(void* base,size_t nitems, size_t size, int (*compar)(const void *, const void*))

代码中的实际使用格式:

void qsort(void* base, int nitems, int size, int (*compar)(const void*, const void*))

2.1.1 参数

* base--指向要排列数组的首元素地址

* nitems--指向要排列数组的数组个数

* size--指向要排列数组内的一个元素大小

* compar--比较俩个元素的函数(自定义函数)

2.1.1.1  参数类型

void* base

这里的指针之所以是void类型的,是为了适应更多的数组排序情况

如果这里是int*、short*、 char*、 float*等固定的指针类型,那么该qsort函数的适用性将大大减少

应为base为指向要排列数组的首元素地址, 数组的类型有很多,不可能每次要排序的数组都刚好是int、char、double等类型,所以开发者为了使qsort函数的适用性更广,这里选择了void类型

(void类型的指针变量,可以存放任何类型的地址,非void类型的指针变量,只能存放相对应的类型的地址)

void  (*compar)(const void*, const void*)

 首先这是函数指针类型,compar是函数指针变量

const是为了保证后面的参数,无法通过*p(这里的p代表指针变量)来改变他的值

2.2 qsort函数的使用

#include<stdio.h>
#include<stdlib.h>

//比较函数
int compar(const void* p1, const void* p2)
{
	//return *((int*)p2) - *((int*)p1);——为降序
	return *((int*)p1) - *((int*)p2);//升序
	//这里需要注意 void类型的是不能直接加(*)解引用的,应为计算机不知道void类型的指针大小是多少,所以这里需要我们强制转化为相对应的指针类型
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//定义一个降序的数组
	int nitems = sizeof(arr) / sizeof(arr[0]);//求数组元素个数
	qsort(arr, nitems, sizeof(arr[0]), compar);//首元素地址、元素个数、单个元素大小、比较函数
	for (int i = 0; i < nitems; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

 运行结果:

0 1 2 3 4 5 6 7 8 9

这里就是要注意int compar(const vodi* p1,  const void* p2) 中的const不要忘了

还有该函数体内的强制转换部分,一定是转换成和需要排列数组的类型相对应的指针类型

#include<stdio.h>
#include<stdlib.h>

//定义结构体
struct stu
{
	char name[20];//名字
	int age;//年龄
};
//比较函数
int com_par(const void* p1, const void* p2)
{
//这里需要注意的是在强制转换的时候,注意类型是结构体类型
	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);//这里'.'和'->'都可以实现只要定位到name就可以
}
int main()
{
	struct stu add[] = { {"zhangsan",99}, {"lisi", 20}, {"wangwu", 88} };
	int sz = sizeof(add) / sizeof(add[0]);
	qsort(add, sz, sizeof(add[0]), com_par);//首元素地址、数组元素个数、单个元素大小,比较函数
    for (int i = 0; i < sz; i++)
	{
		printf("%s %d\n", add[i].name, add[i].age);
	}
	return 0;
}

运行结果:

lisi 20
wangwu 88
zhangsan 99

这一段代码我们比较的是字符串,所以就用到了strcmp(x,y)函数(字符串比较函数),如果 传入该函数的值相等,那就返回0,如果x>y那就返还大于零的数,如果小于那就返还小于零的数

其次就是强制类型转换,一定要转换成相对应的数组类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值