/*
快速排序法
函数原型(stdlib.h内声明了该原型)
void qsort(void*, size_t, size_t, int*(const void*, const void*))
或
void qsort(void *base,size_t nmemb,size_t size,int (*compar)(const void *,const void *)
第一个参数base--需要排序的数组地址既数组头部的指针
第二个参数nmemb--需要排序的member数
第三个参数size--需要排序的单个元素的大小--一般是传入 sizeof(类型名)
第四个参数int(*compar)(const void *,const void *)--传入一个指向函数的指针,该形式的函数需要自己定义。qsort根据返回的int值来决定升序、降序或其他自定义的实现。
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); //给vals数组赋值
puts("Random list: ");
showarray(vals,NUM);//显示数组各元素
qsort(vals,NUM,sizeof(double),mycomp); //从大到小排序
puts("\nSorted list: ");
showarray(vals,NUM);//显示经排序后的数组
return 0;
}
//操作数组空间的函数--赋予vals数组各元素具体的值
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');
}
putchar('\n');
}
//默认按按从小到大的顺序排序值,如果将*a1>*a2返回-1就是降序
int mycomp(const void *p1,const void * p2)
{
return *(double*)p1 - *(double*)p2;
}