C Primer Plus学习 五十六 qsort ()函数

       快速排序(quick sort)法是最有效的排序算法之一,对大型数组而言更是如此。该算法在1962年由 C.A.R.Hoare开发。它把数组不断分成更小的数组,直到变成单元素数组。首先,将数组分成两部分,其中 一部分的值都小于另一部分的值。继续这个过程,直至数组完全排好序为止。
C实现的快速排序算法的函数名为qsort ()。qsort ()函数对数据对象数组进行排序,其ANSI原 型为:
void qsort (void *base» size_t nmemb* size_t size, int (*compar) (const void *,const void *));
        第一个参数为指向要排序的数组头部的指针。ANSI C允许将任何数据类型的指针转换为void类型指 针,因而qS〇rt()的第一个实际参数可以指向任何类型的数组。
        第二个参数为需要排序的项目数量。函数原型将该值转换为size_t类型。回忆一下前面的多次说明, siZe_t是由运算符sizeof返回,并在标准头文件中定义的整数类型。

        因为qsort ()将第一个参数转换为void指针,所以会失去每个数组元素的大小信息。为补充该信息,必须把数据对象的大小明确地告诉qsort ()。这就是第三个参数的作用。例如,如果对double数组排序, 可使用sizeof (double)作为qsort ()的第三个参数。
        最后,qsort ()还需要一个指向函数的指针,被指向的函数用于确定排序顺序。这个比较函数应该接 受两个参数,即分别指向进行比较的两个项目的指针。如果第一个项目的值大于第二个项目的值,那么比 较函数返回正数:如果两个项目的值相等,那么返回〇;如果第一个项目的值小于第二个项目的值,那么 返回负数。qsort ()根据给定的其他信息计算出两个指针值,然后把它们传递给该比较函数。
比较函数采用的形式在qsort ()原型最后的参数中声明:

int (*compar) const void *,const void *)

        这表示最后的参数是个指向函数的指针,该函数返回im值并接受两个参数,而每个参数均为指向 const void类型的指针。这两个指针指向需要比较的项目。

/* qsorter.c --使用qsort ()对一组数字排序*/

#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 vals[NUM];

fillarray(vals,NUM);

puts("Random list:");

showarray(vals,NUM);

qsort(vals,NUM,sizeof(double),mycomp);

puts("\nsorted list:");

showarray(vals,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');

}

if(index%6!=0)

putchar('\n');

}

/*按从小到大的顺序抹序值*/

int mycomp(const void *p1,const void *p2)

{

/*需要使用指向double的指针访问值*/

const double *a1=(const double*)p1;/* al是合适的指针类型*/

const double *a2=(const double*)p2;

if(*a1<*a2)

    return -1;

    else if(*a1<*a2)

         return 0;

    else 

    return 1; 

}

下面是一个运行示例:


qsort ()函数对一个数据对象数组进行排序。我们再次给出它的ANSI原型:

void qsort (void *base» size_t nmemb, size—t size.

int (*compar) (const void *. const void *)):

       第一个参数为指向要排序的数组头部的指针。本程序的实际参数为vals。vals是一个double数组名, 因此是指向数组第一个元素的指针。这个ANSI原型把参数vals类型指派为void指针。这是因为ANSI C 允许把任何数据类型指针类型指派为void指针,从而允许qsort ()的第一个实际参数指向任何类型的 数组。

第二个参数为需要排序的项目数量。程序中为Num,即数组元素的个数。函数原型将该值 转换为size_t类型。

第三个参数为每个元素的大小。本例中为sizeof (double)。

最后的参数为mycomp,即对元素进行比较的函数的地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值