C语言库函数— qsort () 详解
创始人
2024-04-14 03:10:23

目录

1. qsort()函数简介

1.1 函数原型

1.2 函数参数 

2. 比较函数简介

2. 1 比较函数参数 

2.2 比较函数使用 

3. qsort()函数使用 

3.1 整形数组排序

 3.2 字符数组排序

3.3 浮点型数组排序(double类型为例)

3. 4 字符串数组排序 

3.5 结构体 


1. qsort()函数简介

qsort()函数是C语言库函数中的一种排序函数,排序方法为快速排序(quick sort) 。

其特点是可以排序任意类型的数组元素。

1.1 函数原型

void qsort(void* base, size_t num, size_t size, int (*comparator)(const void* elem1, const void* elem2));

需引用头文件:

1.2 函数参数 

qsort()函数需要四个参数

1. void* base:  需排序数组首元素

2. size_t num: 数组元素个数

3. size_t size: 一个数组元素大小(byte)

4. int (*comparator) (const void* elem1 , const void* elem2):  是一个函数指针,其指向的是一个比较函数的地址,该函数有两个void* 的参数,其返回类型为int 。

void* 类型指针:可以接收任意类型的地址,但不能进行解引用操作和不能对其进行加减整数的操作。

2. 比较函数简介

2. 1 比较函数参数 

比较函数为自定义函数:其两个参数为void*类型指针的elem1和elem2 ,返回参数为整形int

参数类型为void*原因:不清楚需比较元素的类型是什么,所以通过void*类型指针的特点(可以接收任意类型的地址)来接收。const修饰其两个比较参数不可被更改

返回值有三种情况: 

 < 0 : elem1 小于 elem2

 = 0 : elem1 等于 elem2

 > 0 : elem1 大于 elem2

2.2 比较函数使用 

如需使用比较函数而void*类型指针不能解引用操作和加减整数操作我们只需对两个元素进行强制类型转换为我们想比较元素的类型指针,再进行解引用获取两个元素的值,最后进行两个元素的差值返回

整型数组

int comp_int(const void* elem1, const void* elem2)
{return *(int*)elem1 - *(int*)elem2;
}

字符数组

int comp_char(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;//字符计算是计算ASCLL值
}

浮点型数组

int comp_double(const void* elem1, const void* elem2)
{return (int)(*(double*)elem1 - *(double*)elem2);
//浮点型差值为浮点型,而返回值需要为int型,避免报错将差值强制类型转换为int型
}

字符串

按首字母排序

int comp_char(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;//字符计算是计算ASCLL值
}

按字符串长度排序

int comp_string(const void* elem1, const void* elem2)
{if (strlen(*(char*)elem1) > strlen(*(char*)elem2)){return 1;}else if (strlen(*(char*)elem1) < strlen(*(char*)elem2)){return -1;}else{return 0;}
}

按正常排序

int comp_string(const void* elem1, const void* elem2)
{return strcmp(*(char*)elem1, *(char*)elem2);//strcmp比较两个字符串大小
}

结构体

struct stu
{char name[20];int grade;
};

对学生姓名排序

int comp_string(const void* elem1, const void* elem2)
{return strcmp(((str*)elem1)->name, ((str*)elem2)->name);
}

对学生成绩排序

int comp_string(const void* elem1, const void* elem2)
{return strcmp(((str*)elem1)->grade, ((str*)elem2)->grade);
}

3. qsort()函数使用 

3.1 整形数组排序

int cmp_int(const void* elem1, const void* elem2)
{return *(int*)elem1 - *(int*)elem2;
}
int main()
{int arr[] = { 2,4,6,8,10,1,3,5,9,7 };int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;qsort(arr, sz, sizeof(arr[0]), cmp_int);for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

 3.2 字符数组排序

int cmp_char(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;
}
int main()
{char ch[] = {'b','c','a','e','f','d','g'};int sz = sizeof(ch) / sizeof(ch[0]);int i = 0;qsort(ch, sz, sizeof(ch[0]), cmp_char);for (i = 0; i < sz; i++){printf("%c ", ch[i]);}return 0;
}

3.3 浮点型数组排序(double类型为例)

int cmp_double(const void* elem1, const void* elem2)
{return (int)(*(double*)elem1 - *(double*)elem2);
}
int main()
{double arr[] = {2.5,1.0,3.5,4.5,2.0};int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;qsort(arr, sz, sizeof(arr[0]), cmp_double);for (i = 0; i < sz; i++){printf("%f ", arr[i]);}return 0;
}

3. 4 字符串数组排序 

按字符串首字母排序

int cmp_string(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;
}
int main()
{char ch[5][10] = { "black","cat","apple","face","dog" };int sz = sizeof(ch) / sizeof(ch[0]);int i = 0;qsort(ch, sz, sizeof(ch[0]), cmp_string);for (i = 0; i < sz; i++){printf("%s ", ch[i]);}return 0;
}

 按正常排序

int cmp_string(const void* elem1, const void* elem2)
{return strcmp((char*)elem1,(char*)elem2);
}
int main()
{char ch[5][10] = { "aaa","a","aaaaa","aa","aaaa" };int sz = sizeof(ch) / sizeof(ch[0]);int i = 0;qsort(ch, sz, sizeof(ch[0]), cmp_string);for (i = 0; i < sz; i++){printf("%s ", ch[i]);}return 0;
}

3.5 结构体 

typedef struct Stu
{char name[20];int age;
}Stu;int cmp_str(const void* elem1, const void* elem2)
{return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);
}int main()
{Stu s[] = { {"张三",18},{"李四",19},{"王五",20} };int sz = sizeof(s) / sizeof(s[0]);int i = 0;qsort(s, sz, sizeof(s[0]), cmp_str);for (i = 0; i < sz; i++){printf("%s %d\n", s[i].name, s[i].age);}return 0;
}

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
tag是什么意思 tab是什么... 一、B端基础控件的认识控件一词,直译的话可以翻译成 “用来控制的元件”,是我们对 B 端系统进行信息...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
tag是什么意思 tab是什么... 一、B端基础控件的认识控件一词,直译的话可以翻译成 “用来控制的元件”,是我们对 B 端系统进行信息...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...