qsort函数

作用:在一个数组中以升序的方式对数据进行排序,可以使用qsort排序任意类型的数据,注意数组中元素的长度是固定的。

原型:

void qsort(void base,size_t n_elements,size_t el_size,int(compare)(void const,void const));

函数说明:

第一个参数指向需要排序的数组,第二个参数指向数组中元素的数目,第三个参数指定每个元素的长度(以字符为单位),第四个参数是一个函数指针,用于对需要排序的数组进行比较。

第四个参数有点难理解,做下笔记:

比较函数接受两个参数,它们分是指向两个需要比较进行的值的指针。这个函数要我们自己编写,告诉qsort怎么来排序。函数应该返回一个整数,大于零,小于零,还是小于零,分别表示第一个参数大于、小于或者等于第二个参数。由于这个函数与类型无关,参数被设定为void*类型。在比较函数中必须使用强制类型转换把它们转换为合适的指针类型。下面是一些各类型的比较函数:

一、对int类型数组排序
int num[100];

int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}

qsort(num,100,sizeof(num[0]),cmp);

二、对char类型数组排序(同int类型)
char word[100];

int cmp( const void *a , const void *b )
{
return *(char *)a - *(int *)b;
}

qsort(word,100,sizeof(word[0]),cmp);

三、对double类型数组排序
double in[100];

int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}

qsort(in,100,sizeof(in[0]),cmp);

四、对结构体一级排序
struct Sample
{
double data;
int other;
}s[100]

//按照data的值从小到大将结构体排序

int cmp( const void *a ,const void *b)
{
return (*(Sample *)a).data > (*(Sample *)b).data ? 1 : -1;
}

qsort(s,100,sizeof(s[0]),cmp);

五、对结构体二级排序
struct Sample
{
int x;
int y;
}s[100];

//按照x从小到大排序,当x相等时按照y从大到小排序

int cmp( const void *a , const void *b )
{
struct Sample *c = (Sample *)a;
struct Sample *d = (Sample *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}

qsort(s,100,sizeof(s[0]),cmp);

六、对字符串进行排序

struct Sample
{
int data;
char str[100];
}s[100];

//按照结构体中字符串str的字典顺序排序

int cmp ( const void *a , const void *b )
{
return strcmp( (*(Sample *)a).str , (*(Sample *)b).str );
}

qsort(s,100,sizeof(s[0]),cmp);

bsearch函数

作用:在一个已经排好序的数组中用二分法查找一个特定的元素。注意如果数组没有排序,结果是未定义的。

原型:void bsearch(void const *key, void const *base, size_tn_elements, size_t le_size, int (compare)(void const *, void const *));

说明:

第一个参数指向需要查找的值,第二个参数指向查找所在的数组,第三个参数指定数组中元素的数目,第四个参数是每个元素的长度(以字符为单位)。最后一个参数适合qsort中相同的指向比较函数的指针。
当找到需要查找的值时,函数返回一个指向查找到的数组元素的指针。如果找不到,则返回一个NULL 指针。

关键字参数的类型必须与数组元素的类型相同。如果数组中的结构包含了一个关键字字段和其它的一些数据,必须创建一个完整的结构并且填充关键字字段。其他字段可以留空,因为比较函数只检查关键字字段。

写了个小程序说巩固下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//定义比较函数
int q_compare(const void a,const void *b)
{
return *(int *)a-
(int *)b;
}

int main(void)
{
    int array[]={2,3,4,5,6,3,54,23,2323,5223,63,6234,3,2345,74,783,9,65,85};
    int a_len=sizeof(array)/sizeof(array[0]);//计算数组元素的个数
    int number_s;//欲查找的值
    int *sign=NULL;//保存bsearch的返回值

    qsort(array,a_len,sizeof(array[0]),q_compare);//先对数组进行排序
    puts("input the number you wantta search!");
    scanf("%d",&number_s);//输入欲查找的值
    sign=bsearch(&number_s,array,a_len,sizeof(array[0]),q_compare);

    if(sign)//找到该数值
        printf("the number %d have found!\n",*sign);
    else//为找到该数值
        printf("\athe number %d do not founded!\n",number_s);

    return 0;
}