C 标准库qsort函数的使用

快速排序(quick sort)是最有效的排序算法之一。

C实现的快速排序算法的函数名为qsort(), qsort()函数对数据对象数据进行排序。其函数原型在头文件stdlib.h中

其原型为:

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *,const void *));

 第一个参数为指向要排序的数组头部指针,因为任何数据类型的指针可以转化成void类型指针,故qsort()的第一个参数可以指向任何类型的数组;

第二个参数为要排序的元素数量;

第三个参数为数组中数据对象的大小。因为qsort()将第一个参数转换为void指针,所以会失去每个数组元素的大小信息,为了补充该信息必须把数据对象的大小明确告诉qsort();

第四个参数为指向函数的指针,被指向的函数用于确定排序的规则。该函数接受两个参数,分别为指向进行比较的两个元素,

如果第一个元素大于第二个元素返回正数,小于返回负数,等于返回0;

 

下面的示例程序创建了一个由随机浮点数组成的数组,并对该数组排序。

/*
 *  qsort函数的使用
 *  函数原型 void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *,const void *));
 */
#include <stdio.h>
#include <stdlib.h>

#define NUM 40
void fillarray(double ar[], int n);
void showarray(const double ar[], int n);
int mycomp(const void *p1, const void *p2);

int main(void)
{
    double ar[NUM];
    fillarray(ar, NUM);
    printf("Random List:\n");
    showarray(ar, NUM);
    qsort(ar, NUM, sizeof(double), mycomp);//函数调用
    printf("\nSorted List:\n");
    showarray(ar, NUM);

    return 0;
}

//产生随机数数组
void fillarray(double ar[], int n)
{
    int index;

    for (index = 0; index < n; index++)
    {
        ar[index] = (double)rand() / ((double)rand() + 0.1);
    }
}

//打印数组
void showarray(const double ar[], int n)
{
    int index;

    for (index = 0; index < n; index++)
    {
        printf("%9.4f ", ar[index]);
        if (index % 6 == 5)
        {
            putchar('\n');
        }
    }
}

//排序规则
int mycomp(const void *p1, const void *p2)
{
    const double *a1 = (const double *)p1;
    const double *a2 = (const double *)p2;

    if (*a1 < *a2)
    {
        return -1;
    }
    else if (*a1 == *a2)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

 输出结果:

Random List:
   0.0022    0.2390    1.2191    0.3910    1.1021    0.2027
   1.3835   20.2830    0.2508    0.8880    2.2179   25.4866
   0.0236    0.9308    0.9911    0.2507    1.2802    0.0939
   0.9760    1.7217    1.2054    1.0326    3.7892    1.9635
   4.1137    0.9241    0.9971    1.5582    0.8955   35.3798
   4.0579   12.0460    0.0096    1.0109    0.8506    1.1529
   2.3614    1.5876    0.4825    6.8749
Sorted List:
   0.0022    0.0096    0.0236    0.0939    0.2027    0.2390
   0.2507    0.2508    0.3910    0.4825    0.8506    0.8880
   0.8955    0.9241    0.9308    0.9760    0.9911    0.9971
   1.0109    1.0326    1.1021    1.1529    1.2054    1.2191
   1.2802    1.3835    1.5582    1.5876    1.7217    1.9635
   2.2179    2.3614    3.7892    4.0579    4.1137    6.8749
  12.0460   20.2830   25.4866   35.3798

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值