(C语言)qsort函数的使用

简介: 1.qsort函数的介绍2.qsort函数的声明3.qsort函数的使用1.整形2.浮点型3.结构体类型(1)一级排序(2)多级排序

1.qsort函数的介绍

qsort函数能够排序任意数据类型的数组,如整形、浮点型、字符串以及结构体类型。


qsort函数是库函数,在使用时应包含对应的头文件(#include)


2.qsort函数的声明

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


void *base:需要排序的数组的首元素的地址


size_t num:数组的元素个数


size_t width:数组元素的大小(所占字节数)


int (*compare)(const void* elem1, const void* elem2):该参数为函数指针,指向一个比较函数,在排序时,用来比较两个元素大小。两个参数(elem1, elem2)为所比较元素的地址,参数类型为void*,因此可以接收任意类型的参数。


返回类型为Int,elem1 < elem2时,返回<0的值;elem1 = elem2时,返回0;elem1 > elem2时,返回>0的值(此时排序为升序,若想将排序改为降序,只需在elem1 < elem2时返回>0的值,elem1 > elem2时,返回<0的值)


3.qsort函数的使用

1.整形

首先实现比较函数(cmp_int)

intcmp_int(constvoid*p1, constvoid*p2)
{
return (*((int*)p1)) - (*(int*)p2);
}


首先将指针强制类型转换为整形指针,再进行解引用获得元素的值,最后返回两个元素的差值。


再调用qsort函数

#include <stdio.h>#include <stdlib.h>intcmp_int(constvoid*p1, constvoid*p2)
{
return (*((int*)p1)) - (*(int*)p2);
}
voidtest1()
{
intarr[] = { 1,2,10,4,11,6,7,9,0 };
intsz=sizeof(arr) /sizeof(arr[0]);
printf("排序前: ");
for (inti=0; i<sz; i++)
    {
printf("%d ", arr[i]);
    }
printf("\n");
qsort(arr, sz, sizeof(arr[0]), cmp_int);
printf("排序后: ");
for (inti=0; i<sz; i++)
    {
printf("%d ", arr[i]);
    }
printf("\n");
}
intmain()
{
test1();
return0;
}


排序结果


22.png


2.浮点型

首先实现比较函数cmp_double


double为8字节,若直接返回两个元素的差值,此时强制类型转换为int,浮点类型不完整,则可能出现错误



23.png


因此在处理时使用if else语句判断

intcmp_double(constvoid*p1, constvoid*p2)
{
doubleret=*(double*)p1-*(double*)p2;
if (ret>0)
return1;
elseif (ret<0)
return-1;
elsereturn0;
}


再调用qsort函数

#include <stdio.h>#include <stdlib.h>intcmp_double(constvoid*p1, constvoid*p2)
{
doubleret=*(double*)p1-*(double*)p2;
if (ret>0)
return1;
elseif (ret<0)
return-1;
elsereturn0;
}
voidtest2()
{
doublearr[] = { 1.3,3,2.1,0.9,1.7,10.3,9.1 };
intsz=sizeof(arr) /sizeof(arr[0]);
printf("排序前:");
for (inti=0; i<sz; i++)
    {
printf("%.2lf ", arr[i]);
    }
printf("\n");
qsort(arr, sz, sizeof(arr[0]), cmp_double);
printf("排序后:");
for (inti=0; i<sz; i++)
    {
printf("%.2lf ", arr[i]);
    }
printf("\n");
}
intmain()
{
test2();
return0;
}


排序结果


24.png


3.结构体类型

在对结构体类型进行排序时,首先要确定排序的依据


如结构体

structstu{
intage;
charname[10];
doublescore;
};


首先确定是依据年龄、姓名还是分数进行排序,或是进行多级排序,即先按分数排序,若分数相同,则按姓名排序。


(1)一级排序

按姓名进行排序


比较函数cmp_by_name


使用strcmp函数比较两个字符串的大小

intcmp_stu_by_name(constvoid*p1,constvoid*p2)
{
return (strcmp(((structstu*)p1)->name , ((structstu*)p2)->name ));
}


调用qsort函数

#include <stdio.h>#include <stdlib.h>#include <string.h>structstu{
intage;
charname[10];
doublescore;
};
intcmp_stu_by_name(constvoid*p1,constvoid*p2)
{
return (strcmp(((structstu*)p1)->name , ((structstu*)p2)->name ));
}
voidtest3()
{
structstustudents[3] = { {12,"li",90.5},{11,"zhang",80.3},{10,"wang",97.6} };
intsz=sizeof(students) /sizeof(students[0]);
printf("排序前:\n");
for (inti=0; i<sz; i++)
    {
printf("%d %s %.2lf", students[i].age, students[i].name, students[i].score);
printf("\n");
    }
printf("\n");
qsort(students, sz, sizeof(students[0]), cmp_stu_by_name);//按名字排序printf("排序后:\n");
for (inti=0; i<sz; i++)
    {
printf("%d %s %.2lf", students[i].age, students[i].name, students[i].score);
printf("\n");
    }
printf("\n");
}
intmain()
{
test3();
return0;
}


排序结果


25.png


(2)多级排序

先按照成绩排序,若成绩相同,则按照名字排序


比较函数cmp_stu

intcmp_stu(constvoid*p1, constvoid*p2)
{
doubleret= ((structstu*)p2)->score- ((structstu*)p1)->score;
if (ret>0)
return1;
elseif (ret<0)
return-1;
elsereturn (strcmp(((structstu*)p1)->name, ((structstu*)p2)->name));
}


在成绩相同时,按照名字进行排序,若还要按照年龄排序,在名字相同时,按照年龄排序即可。


调用qsort函数

#include <stdio.h>#include <stdlib.h>#include <string.h>structstu{
intage;
charname[10];
doublescore;
};
intcmp_stu(constvoid*p1, constvoid*p2)
{
doubleret= ((structstu*)p2)->score- ((structstu*)p1)->score;
if (ret>0)
return1;
elseif (ret<0)
return-1;
elsereturn (strcmp(((structstu*)p1)->name, ((structstu*)p2)->name));
}
voidtest3()
{
structstustudents[] = { {12,"li",90.5},{11,"zhang",80.3},{10,"wang",97.6},{12,"zhao",80.3} };
intsz=sizeof(students) /sizeof(students[0]);
printf("排序前:\n");
for (inti=0; i<sz; i++)
    {
printf("%d %s %.2lf", students[i].age, students[i].name, students[i].score);
printf("\n");
    }
printf("\n");
qsort(students, sz, sizeof(students[0]), cmp_stu);
printf("排序后:\n");
for (inti=0; i<sz; i++)
    {
printf("%d %s %.2lf", students[i].age, students[i].name, students[i].score);
printf("\n");
    }
printf("\n");
}
intmain()
{
test3();
return0;
}


排序结果

26.png


目录
相关文章
|
1天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
1天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
15 2
|
1天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
1天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
1天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
1天前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
|
1天前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
5 0
|
1天前
|
C语言
【C语言】字符分类函数与字符转换函数
【C语言】字符分类函数与字符转换函数
11 1
|
1天前
|
程序员 编译器 C语言
C语言之函数与参数
C语言之函数与参数
8 0
|
1天前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)

热门文章

最新文章