ITPub博客

首页 > 应用开发 > > c标准库中的快速排序法qsort( )

c标准库中的快速排序法qsort( )

作者:rainbows 时间:2019-09-02 13:43:54 0 删除 编辑

快速排序法原型为: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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-15

  • 博文量
    112
  • 访问量
    1268