前言
网上有很多关于qsort函数的讲解,其中对于原理的讲解十分复杂,并且实用性不高。因此小编直接从实用性入手,保证看完就会用!大大提高效率并节约您宝贵的时间。
一、头文件
qsort是stdlib.h中的函数,因此使用前需要声明:
#include<stdlib.h>
二、格式
1.参数
qsort函数包含四个参数,分别是:
1.数组名
2.元素个数(从前往后计算)
3.数组元素所占字节(int,double,char等所占字节)
4.排序原则(递增,递减,奇偶交叉等)
int cmp(const void *a,const void *b) {
return *(int*)a-*(int*)b;
}
qsort(num, n, sizeof(int), cmp);
2.含义
前三个大概没什么好说的,非常简单。主要介绍下第四个的排序原则。
我们通过定义一个函数cmp,通过cmp返回的参数来确定排序规则,需要注意的是:cmp函数的参数需要以const void *a,const void *b的形式来定义,表示a和b的类型是未确定的,在return中进行强制类型转换为int型。*(int*)a-*(int*)b表示以递增顺序,若想以递减只需将a和b换位。
3.不同类型排序
对于不同类型的数组排序,qsort函数的格式都是相同的,唯一不同在于cmp函数中的返回值类型。
1.整型(int)
int cmp(const void *a,const void *b) {
return *(int*)a-*(int*)b;
}
2.浮点数(double)
需要注意浮点数会存在精度损失的问题,所以我们需要通过比较,来返回1或-1,以确定是增序还是降序。
int cmp(const void *a,const void *b) {
return *(double*)a>*(double*)b?1:-1;
}
3.字符(char)
int cmp(const void *a,const void *b) {
return *(char*)a-*(char*)b;
}
4.结构体
struct node{
int i;
double j;
char k;
};
int cmp(const void *a,const void *b) {
return (*(node*)a).i-(*(node*)b).i;
}
以int为例,其他遵循相同原则;若是要逐级比较,只需增加判断即可。
总结
以上便是qsort函数的使用方法,相信大家已经明白如何使用了。下面是简单的例子:
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b) {
return *(int*)a-*(int*)b;
}
int main() {
int n,i;
scanf("%d",&n);
int time[n];
for(i=0; i<n; i++) {
scanf("%d",&time[i]);
}
qsort(time,n,sizeof(int),cmp);
for(i=0;i<n;i++){
printf("%d ",time[i]);
}
return 0;
}