void qsort(
void *base,
size_t n,
size_t size,
int (*compar)(const void *, const void *)
);
在使用时,用户需要自己编写一个判断两个数(不仅限于数字)比较大小的方法;
比如简单的判断两个数字的大小:
int num_comp(const int *a,const int *b)
{
if(*a==*b)
return 0;
return *a>*b?1:-1;
}
注意函数的格式是不能变的,且第一个参数>第二个参数,需要返回一个正数.
在调用时,该如何调用呢?
如果有一个数组int num[100];
里面是100个未排序的数字,要将这个数组按升序排列;
调用qsort函数:
qsort(num,100,sizeof(int),(int (*)(const void *,const void *))num_comp);
说明一下这里的参数,
第一个参数num是数组名;
第二个参数100是说这个要排序的数组大小num[0]到num[100-1];
第三个参数是排序的元素大小,这里是Int类型;
第四个是比较函数的指针,(int (*)(const void *,const void *))
是指针类型转换;num_comp
是要比较函数的地址;
#include
#include
#include
using namespace std;
int num_comp(const int *a,const int *b);
int main()
{
int num[100]={0};
srand(time(0));
//数组初始化,填满0-100随机数;
for(int i=0;i<100;i++)
num[i]=rand()%101;
//升序排序;
qsort(num,100,sizeof(int),(int (*)(const void *,const void *))num_comp);
//输出;
for(int i=0;i<100;i++)
cout<<num[i]<<' ';
}
int num_comp(const int *a,const int *b)
{
if(*a==*b)
return 0;
return *a>*b?1:-1;
}
如果想要进行降序排列,只需要修改return *a>*b?1:-1;
变成return *a<*b?1:-1;
即可.
C库
其函数原型是:
void *bsearch( const void *key, const void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );
参数说明:
1、key是要寻找的关键数字,传入时以地址方式传入;
2、buf是要寻找的数组,传入首地址;
3、num是数组的元素个数,可以用宏定义解决;
4、size是数组元素的大小;
5、比较函数;
调用方法:
需要用户提供一个比较函数,同上面快排的比较函数;
#include
#include
#include
using namespace std;
#define SIZE(x) sizeof(x)/sizeof(x[0]) //宏定义数组元素个数;
typedef int(*COMP_P)(const void *,const void *); //定义指向比较函数的指针类型;
int num_comp(const int *a,const int *b);
int main()
{
//随机初始化数组;
int num[100]={0};
srand(time(0));
for(int i=0;i<100;i++)
num[i]=rand()%101;
//升序排列;
qsort(num,100,sizeof(int),(int (*)(const void *,const void *)) num_comp);
//查看已排序数组;
for(int i=0;i<100;i++)
cout<<num[i]<<' ';
//输入要查找的数字;
int number=5;
cin>>number;
//二分查找;
int *p=(int *)bsearch(&number,num,SIZE(num),sizeof(int),(COMP_P)num_comp);
//打印查找数据;
if(p!=NULL)
{
cout<<endl<<*p;
cout<<endl<<"index is:"<<p-num;
}
else
cout<<endl<<"not found"<<endl;
}
int num_comp(const int *a,const int *b)
{
if(*a==*b)
return 0;
return *a>*b?1:-1;
}
需要注意的是,这里定义了一个指向比较函数的指针类型COMP_P
,在传入函数地址时,将函数类型转换一下。
而且bsearch函数返回的不是要查找数字在数组中的索引,而是返回查找到的数字的指针,因此需要定义一个int *p
的指针来接收这个指针,如果没有找到返回NULL