qsort是stdlib.h中的函数,因此使用前需要声明:
#include
qsort函数包含四个参数,分别是:
数组名
元素个数(从前往后计算)
数组元素所占字节(int,double,char等所占字节)
排序原则(递增,递减,奇偶交叉等)
int cmp(const void *a,const void *b) {return *(int*)a-*(int*)b;
}
qsort(num, n, sizeof(int), cmp);
前三个大概没什么好说的,非常简单。主要介绍下第四个的排序原则。
我们通过定义一个函数cmp,通过cmp返回的参数来确定排序规则,需要注意的是:cmp函数的参数需要以const void a,const void b的形式来定义,表示a和b的类型是未确定的,在return中进行强制类型转换为int型。(int)a-(int)b表示以递增顺序,若想以递减只需将a和b换位。
对于不同类型的数组排序,qsort函数的格式都是相同的,唯一不同在于cmp函数中的返回值类型。
int cmp(const void *a,const void *b) {return *(int*)a-*(int*)b;
}
需要注意浮点数会存在精度损失的问题,所以我们需要通过比较,来返回1或-1,以确定是增序还是降序。
int cmp(const void *a,const void *b) {return *(double*)a>*(double*)b?1:-1;
}
int cmp(const void *a,const void *b) {return *(char*)a-*(char*)b;
}
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
#include
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; iscanf("%d",&time[i]);}qsort(time,n,sizeof(int),cmp);for(i=0;iprintf("%d ",time[i]);}return 0;
}