005 快排qsort库函数的用法——“C”

文章目录


前言

Reference - C++ Reference (cplusplus.com)可在此网站查阅相关函数信息


提示:以下是本篇文章正文内容,下面案例可供参考

一、qsort快排函数是什么

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

1.qsort的参数

void qsort( void *base,

//指向待排序数的第一个元素

size_t num,

//待排序数的元素个数

size_t width,     size_t表示无符号数

//每个元素的字节大小

int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

compare是一个指向操作者提供函数的指针,该函数比较两个数组元素并返回指定它们之间关系的值即  Value:>0,<0,=0给qsort这个库函数,由qsort内部自行实现排序的过程。

const void *elem1, const void *elem2观察两个数组元素的类型

void*表明无具体指针类型,需要操作者自身指明自己排序的是什么类型

qsort库函数所需要的头文件:

<stdlib.h> and <search.h>

Return ValueDescription
< 0elem1 less than elem2
0elem1 equivalent to elem2
> 0elem1 greater than elem2

二、实现步骤

int cmp_int(const void* p1, const void* p2)
{
       return*(int*)p1 - *(int*)p2;  //强制转换为int*类型,然后解引用得到整型数据
              清楚的知道接下来是要比较2个整数的大小
}
void print_arr(int arr[], int sz)   //打印排序好的数组元素
{
       int i = 0;
       for (i = 0; i < sz; i++)
       {
              printf("%d ", arr[i]);
       }
       printf("\n");
}
test1()
{
       int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
       int sz = sizeof(arr) / sizeof(arr[0]);  //计算数组元素的个数num
       //使用qsort来排序整形数组,这里就要提供一个比较函数,这个比较函数能够比较2个整数的大小
       //qsort 默认是排列成升序的
       qsort(arr, sz, sizeof(arr[0]),cmp_int);    
       print_arr(arr,sz);
}
int main()
{
       test1();
       return 0;
}
struct stu   //定义一个结构体包含name,age成员变量
{
       char name[20];
       int age;
};
按年龄排
int cmp_stu_by_age(const void* p1, constvoid* p2)  //自定义一个函数返回两个元素的关系
{
       return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
按名字排
int cmp_stu_by_name(const void* p1, constvoid* p2) //自定义一个函数返回两个元素的关系
{
       return strcmp(((struct stu*)p1)->name , ((struct stu*)p2)->name);
         //把p1强制类型转换成结构体指针,然后找到成员变量
}
void test2()
{
       struct stu s[] = { {"zhangsan",30} ,{"lisi",25} ,{"wangwu",77} };
       int sz = sizeof(s) / sizeof(s[0]);  //数组元素的个数
       qsort(s, sz, sizeof(s[0]), cpm_stu_by_age);
       qsort(s, sz, sizeof(s[0]), cpm_stu_by_name);
}
int main()
{
       //test1();
       test2();
       return 0;
}

屏幕录制 2023-03-31 221044

屏幕录制 2023-03-31 222015

strcmp返回值qsort所需要的参数一致

ValueRelationship of string1 to string2
< 0string1 less than string2
0string1 identical to string2
> 0string1 greater than string2

posted @ 2023-03-31 22:26  Fan_558  阅读(1)  评论(0编辑  收藏  举报  来源