首页 > 应用开发 > > c标准库中的快速排序法qsort( )
快速排序法原型为:void qsort (void *base,size_t nmemb,size_t size,
int (*compar)(const void *,const void *));
第一个参数是指针,指向等排序的数组的首元素
第二个参数是待排序项的数量
第三个参数是数据类型大小 ,由于第一个参数 为void类型指针,所以qsort不知道数组中每个元素的大小
最后一个参数是一个指向函数的指针,返回值为int ,这个指针指向比较函数用于确定排序的顺序。该函数接受两个参数:分别是
指向比较项的两个指针。如果第1项大于第2项,比较函数返回正数,如果相同,返回0,如果小于负数.
#include
#include
#include
#define SIZE 10
#define NUM 40
/*#ifdef SIZE
#define SIZE 100
#endif*/
typedef struct names{
char first[NUM];
char last[NUM];
}Name;
int mycomp(const void *p1, const void *p2);
void showarray(const Name *ap, int n);
int main(void)
{
Name str[SIZE] = { { "sefd", "fdgrd" },
{ "jtfh", "dgtrf" }, { "dgrfd", "dghdfgh" }, { "sfajf", "ytjuyf" },
{ "sfrd", "dgrgfd" }, { "drgfd", "ytjgh" }, { "fdasf", "sagfr" },
{ "fdas", "trjhg" }, { "sfht", "dgtdfg" }, { "tyjtgh", "juyj" } };
puts("names list:");
showarray(str, SIZE);
qsort(str, SIZE, sizeof(Name), mycomp); //调用的函数mycomp与strcmp类似,返回值相等为0,a1大于a2返回1否则-1;
//传递函数名即传递函数地址
puts("\nSort list:");
showarray(str, SIZE);
getchar();
getchar();
getchar();
return 0;
}
int mycomp(const void *p1, const void *p2)
{
const Name *a1 = (const Name *) p1;
const Name *a2 = (const Name *)p2;
//因为qsort要求指针指向void,要解决这个问题,必须在比较函数的内部声明两个类型正确的指针,并
//初始化它们分别指向作为参数传入的值。
int rest;
rest = strcmp(a1->first, a2->first);
if (rest!= 0)
return rest;
else
{
rest = strcmp(a1->last, a2->last);
return rest;
}
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2442/viewspace-3151537/ ,如需转载,请注明出处,否则将追究法律责任。