C语言排序函数和二分查找调用方法

编程时经常遇到对数组排序或在一个数组中查找数字的情况,C库<stdio.h>中提供了简便的调用方法,将排序算法封装成通用的排序函数;

排序函数qsort

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<iostream>
#include<stdlib.h>
#include<ctime>
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库<stdlib.h>中提供了二分查找函数,用于解决在已排序数组中寻找一个数字;
其函数原型是:

 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<iostream>
#include<cstdlib>
#include<ctime>
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

猜你喜欢

转载自blog.csdn.net/stm32_newlearner/article/details/85772503