最近在刷PAT时C语言中qsort函数的使用极多,所以在这里总结整理了一下,需要的朋友可以参考下。
qsort函数用法
C语言中qsort函数的用法实例详解
- 快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法。
- qsort函数包含在<stdlib.h>中
- qsort函数声明如下:
void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *));
参数说明:
- base,要排序的数组
- nmemb,数组中元素的数目
- size,每个数组元素占用的内存空间,可使用sizeof函数获得
- compar,指向函数的指针也即函数指针。这个函数用来比较两个数组元素,第一个参数大于,等于,小于第二个参数时,分别显示正值,零,负值。
用法实例小结
C语言中的qsort函数包含在<stdlib.h>的头文件里,排序默认都是采用的从小到大排序。
- (如果要降序排序,只需将return里的a,b反过来写即可。)
一、对int类型数组排序
int num[100];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);
二、对char类型数组排序(同int类型)
char word[100];
int cmp( const void *a , const void *b )
{
return *(char *)a - *(char *)b;
}
qsort(word,100,sizeof(word[0]),cmp);
三、对double类型数组排序(特别要注意)
double in[100];
int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}
qsort(in,100,sizeof(in[0]),cmp);
四、对结构体一级排序
- 结构体
struct node
{
double one;
int two;
} s[100];
- 完整代码
struct node
{
double one;
int two;
} s[100];
int cmp( const void *a ,const void *b)
{
return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp);
五、对结构体二级排序
struct node
{
double one;
int two;
} s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序
int cmp( const void *a , const void *b )
{
if((* (node * )a).one != ( * (node * )b).one)
return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;
else return (* (node * )a).two -( * (node * )b).two;
}
qsort(s,100,sizeof(s[0]),cmp);
六、对字符串进行排序
char am = { {"...."}, {"....."}, .....};
//根据字符串首字母排序
int cmp(const void *a, const void *b)
{
return * (char *)a - *(char * )b;
}
qsort(a, m, sizeof(char * ) * n, cmp);
char am = { {"...."}, {"....."}, .....};
//根据字符串长度排序
int cmp(const void *a, const void *b)
{
return strlen((char * )a) > strlen((char * )b) ? 1 : -1;
}
qsort(a, m, sizeof(char * ) * n, cmp);
char am = { {"...."}, {"....."}, .....};
//按照结构体中字符串str的字典顺序排序
int cmp(const void *a, const void *b)
{
return (strcmp((char *)a, (char *)b));
}
qsort(a, m, sizeof(char * ) * n, cmp);
七、计算几何中求凸包的cmp
int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序
{
struct point *c=(point *)a;
struct point *d=(point *)b;
if( calc(*c,*d,p[1]) < 0) return 1;
else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面
return 1;
else return -1;
}
具体样例
1.int类型数组排序
#include<stdio.h>
#include<stdlib.h>
#define L 20
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int main (){
int a[L] = {0, 5, 2, 3, 4, 9, 8, 7, 6, 1,
11, 15, 14, 12, 13, 16, 17, 18, 19, 10};
qsort(a, L, sizeof(int), cmp);
for (int i = 0; i < L; i++){
printf("%d ", a[i]);
}
}
2.double类型数组排序
#include<stdio.h>
#include<stdlib.h>
#define L 20
int cmp(const void *a, const void *b)
{
return *(double *)a > *(double *)b? 1 : -1;
}
int main (){
double a[L] = {0.1, 0.11, 1.1, 1.5, 1.8, 1.51, 2.5, 2.9, 1.3, 0.8,
15.5, 7.9, 8.5, 8.51, 8.6, 3, 1.41, 1.11, 1.51, 2};
qsort(a, L, sizeof(double), cmp);
for (int i = 0; i < L; i++){
printf("%.2lf\n", a[i]);
}
}
3.char类型数组排序
#include<stdio.h>
#include<stdlib.h>
#define L 20
int cmp(const void *a, const void *b)
{
return *(char *)a - *(char *)b;
}
int main (){
char a[L] = {'q', 'w', 'r', 'h', 'a', 'v', 'g', 'e', 'b', 'l',
'o', 'p', 'u', 'y', 't', 'c', 'x', 'i', 'z', 's'};
qsort(a, L, sizeof(char), cmp);
for (int i = 0; i < L; i++){
printf("%c ", a[i]);
}
}
4.字符串进行排序
- 按首字母排序
#include<stdio.h>
#include<stdlib.h>
#define L 10
#define K 10
int cmp(const void *a, const void *b)
{
return *(char *)a - *(char *)b;
}
int main (){
char a[L][K] = {
"rbsgc",
"jcghse",
"gfgd",
"abbbs",
"bbbvs",
"cbfgfe",
"drgafg" ,
"ewqgrta",
"ofggd",
"mbgcv",
};
qsort(a, L, sizeof(char) * K, cmp);
for (int i = 0; i < L; i++){
printf("%s\n", a[i]);
}
}
- 按长度排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
#define K 10
int cmp(const void *a, const void *b)
{
return strlen((char *)a) > strlen((char *)b) ? 1 : -1;
}
int main (){
char a[L][K] = {
"rbsgc",
"jcghse",
"gfgd",
"abbbs",
"bbbvs",
"cbfgfe",
"drgafg" ,
"ewqgrta",
"ofggd",
"mbgcv",
};
qsort(a, L, sizeof(char) * K, cmp);
for (int i = 0; i < L; i++){
printf("%s\n", a[i]);
}
}
- 按字典顺序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
#define K 10
int cmp(const void *a, const void *b)
{
return strcmp((char * )a, (char *)b);
}
int main (){
char a[L][K] = {
"rbsgc",
"jcghse",
"gfgd",
"abbbs",
"bbbvs",
"cbfgfe",
"drgafg" ,
"ewqgrta",
"ofggd",
"mbgcv",
};
qsort(a, L, sizeof(char) * K, cmp);
for (int i = 0; i < L; i++){
printf("%s\n", a[i]);
}
}
5.结构体二级排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
typedef struct node {
double first;
int numb;
}node;
int cmp(const void *a, const void *b)
{
if((* (node *)a).first != ( * (node *)b).first)
return ( * (node * )a).first > ( * (node * )b).first ? 1 : -1;
else return (* (node * )a).numb -( * (node * )b).numb;
}
int main (){
node arr[L] = {
1.0, 1,
2.0, 2,
1.1, 3,
2.1, 4,
3.5, 5,
1.0, 6,
1.1, 7,
5.1, 8,
5.0, 9,
3.6, 10,
};
qsort(arr, L, sizeof(node), cmp);
for (int i = 0; i < L; i++){
printf("%.2lf %d\n", arr[i].first, arr[i].numb);
}
}