学习库函数qsort

作者是一个新手小白,在学习指针的时候,老师讲到了解qsort函数,以下是我的学习与见解

首先qsort函数是一种库函数,是基于quick sort算法的快速排序算法;它的语法如下

void qsort(
   void *base,
   size_t number,
   size_t width,
   int ( *compare )(const void *, const void *)
);

根据msdn的介绍 

参数

 base 是指向待排序数组的基项的指针,

numbver元素中的数组大小
width元素大小(字节)
compare;指向用户提供的例程的指针比较两个数组元素,并返回指定它们关系的值。

例如下面一段代码,就是示范如何调用qsort函数;

int m[4}={1,2,3,4};
//
//
qsort(m,4,4,compare);

其中我们注意到qsort函数要调用compare函数,那么这就要用到我这一节学习的主要内容,函数指针,我们用一个函数指针来接受这个compare函数,不妨这个指针就定义为

int(*compare)(const viod*,const viod*);

我们注意到这里的函数指针指向的compare函数有两个形参,const viod*指针来接收,这是因为viod*指针能接受任何一种类型的指针,在compare函数中,我们进行强制类型转换,来转换成你想要比较的连个参数;

那么我们如何来书写compare函数呢,以下是作者的写的一种算法    

int compare (const void* e1,const void* e2)
{
  return *((int*)e1)-(*((int*)e2);/*此步骤旨在将e1,e2两个指针强制类型转换成为int型的指针,然后解 
                                    引用*/
}                                     

    为什么返回int,以下是qsort函数中对compare函数的约定;

比较函数返回值说明
< 0elem1 小于 elem2
0elem1 等效于 elem2
> 0elem1 大于 elem2

 qsort函数十分的强大我们下面来比较一个结构体中的元素来感受一下

 

#include "stdio.h"
#include "stdlib.h"
struct stu{
	char name;
	int age;
	char sex;
};
int compare_age(const void* age1,const void* age2)
{
	return ((struct stu*)age2)->age-((struct stu*)age1)->age;
}
void test()
{
	int i=0;
	struct stu s[4]={{"xiaoming",99,"男"},{"xiaozhang",100,"女"},{"xiaohong",3,"男"},{"xiaogan",66,"女"}};
	qsort(s,4,sizeof(s[0]),compare_age);
	printf("年龄由大到小的排序为\n");
	for (i=0;i<4;i++)
	{
		printf("%d ",s[i].age);
	}
}
int main()
{
	
    test();
	return 0;
}

 

读者还可以比较其他元素类型的数据不过都大同小异,如有问题欢迎指正;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值