qsort函数怎么用(c语言 qsort)

本文目录
c语言 qsort
排序方法有很多种,
选择排序,冒泡排序,归并排序,快速排序等。
看名字都知道快速排序
是目前公认的一种比较好的排序算法(我没听书速度比这快的了,特殊场合例外),比选择排序,冒泡排序都要快。这是因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。
这就是qsort。
qsort
要求提供一个
比较函数,是为了做到通用性更好一点。比如你不仅仅的是要排序一个数字而已,可能你要用来排序几个数字
,比如有一个结构
struct
num
{
int
a;
int
b;
};
然后我有一个num
类型的数组,
num
dddd;
我想给
dddd这个数组排序,那怎么办?
我想让
a
+b
最大的num元素排在数组的最前面,那又怎么办?
这都可以通过定义比较函数来做到的。
比较函数的作用就是给qsort指明
元素的大小是怎么比较的。
像这样的比较函数
inline
int
MyCmp(const
void*
a,
const
void*
b)
都是有两个元素
作为参数,返回一个int
值,
如果
比较函数返回大于0,qsort就认为
a》b
,
如果比较函数返回等于0
qsort就认为a
和b
这两个元素相等,返回小于零
qsort就认为
a《b
。
qsort
知道元素大小,就可以把大的放到前面去。
如果你的比较函数放回本来应该是1
的(a》b),你比较函数却返回一个
-1
(小于零的)那么qsort认为a《b
的,就把
b放到前面去,但实际上是a大于b的,所以就造成升降序的差别了。
同样的道理,如果有一个
结构
strunt
人{
int
身高;
int
体重;
}
你想让身高最小的人排在最前面,那么你也要自己定义自己的比较函数
,
C语言中qsort函数怎么用
qsort函数是编译器函数库自带的快速排序函数。
qsort 的函数原型是:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
它的参数为: 1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
它在使用的时候需要包含头文件:stdlib.h
实例:
#include《stdio.h》
#include《stdlib.h》
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int main()
{
int *array;
int n;
scanf(“%d“,&n);
array=(int*)malloc(n*sizeof(int));
int i=0;
for(;i《n;i++)
{
scanf(“%d“,(array+i));
}
qsort(array,n,sizeof(int),comp);
for(i=0;i《n;i++)
{
printf(“%d\t“,array[i]);
}
return0;
}
qsort具体用法
六类qsort排序方法
前一段时间做题觉得qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等,故通过查资料将其整理一番。
以下是其具体分类及用法(若无具体说明是以降序排列):
1、对一维数组排序:
(Element_type是一位数组中存放的数据类型,可以是char, int, float, double, etc )
int Comp(const void *p1,const void *p2 )
{
return *((Element_type *)p2) 》 *((Element_type *)p1) ? 1 : -1;
}
int main()
{
Element_type list[MAX];
initial(list);
qsort(list, sizeof(list),sizeof(Element_type),Comp);
return 0;
}
2、对字符串排序:
int Comp(const void *p1,const void *p2)
{
return strcmp((char *)p2,(char *)p1);
}
int main()
{
char a[MAX1][MAX2];
initial(a);
qsort(a,lenth,sizeof(a),Comp);
//lenth 为数组a的长度
3、按结构体中某个关键字排序(对结构体一级排序):
struct Node
{
double data;
int other;
}s;
int Comp(const void *p1,const void *p2)
{
return (*(Node *)p2)-》data 》 (*(Node *)p1)-》data ? 1 : -1;
}
qsort(s,100,sizeof(s),Comp);
4、按结构体中多个关键字排序(对结构体多级排序)[以二级为例]:
struct Node
{
int x;
int y;
}s;
//按照x从小到大排序,当x相等时按y从大到小排序
int Comp(const void *p1,const void *p2)
{
struct Node *c = (Node *)p1;
struct Node *d = (Node *)p2;
if(c-》x != d-》x) return c-》x-d-》x;
else return d-》y - c-》y;
}
5、对结构体中字符串进行排序:
struct Node
{
int data;
char str;
}s;
//按照结构体中字符串 str 的字典序排序
int Comp(const void *p1,const void *p2)
{
return strcmp((*(Node *)p1).str,(*(Node *)p2).str);
}
qsort(s,100,sizeof(s,Comp);
6、计算几何中求凸包的Comp
//以下是俺从别人那儿抄来的,暂时还没用过
int Comp(const void *p1,const void *p2)
//重点Comp函数,把除了1点外的所有的点旋转角度排序
{
struct point *c=(point *)p1;
struct point *d=(point *)p2;
if( cacl(*c, *d,p) 《 0) return 1;
else if(!cacl(*c, *d, p) && dis(c-》x,c-》y,p.x,p.y) 《 dis(d-》x,d-》y,p.x,p.y ) )
//如果在一条直线上,则把远的放在前面
return 1;
else return -1;
}
P.S.:qsort函数是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分发写的,其时间复杂度为n*log(n),其结构为:
void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,const void *));
其中:
*base 为要排序的数组
nelem 为要排序的数组的长度
width 为数组元素的大小(一字结为单位)
(* Comp)(const void *p1,const void *p2) 为判断大小函数的指针,这个函数需要自己定义,如果p1》p2,函数返回-1;a《b,函数返回1;a==b函数返回0

更多文章:
dropdownlist 绑定(DropDownList 绑定所有项 并 显示指定项)
2026年10月11日 08:50
易语言网页api接口怎么调用(易语言,怎么读取网页json的api)
2026年10月11日 08:00
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00






