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,即对元素进行比较的函数的地址。