qsort函数用法简介

xiaoee posted @ 2009年3月17日 23:37 in Coding My Mind with tags 排序 库函数 算法 , 4443 阅读

qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。

函数原型:

void qsort (void  *base,size_t num,size_t size , int (* comparator)(const void * , const void  *));

用法以及参数说明:

Base数组起始地址
num数组元素个数
size每一个元素的大小
comparator函数指针,指向比较函数
1比较函数要接受两个参数,一般要转换成要比较数据的类型;
2比较函数的返回值要反映两个参数是大于,等于还是小于的关系,分别用一个正数,0和一个负数表示。
在比较函数中以第一个参数和第二个参数比较则是从小到大排序。反过来则是从大到小排序。看下面的例子:

对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 ch[100];

int cmp( const void *a , const void *b )
{
return *(char *)a - *(char *)b;
}

qsort(ch,100,sizeof(ch[0]),cmp);

三、对double类型数组排序

double num[100];

int cmp( const  void *a , const  void *b )
{
return *(double *)a - *(double *)b ;
}

qsort(num,100,sizeof(num[0]),cmp);

四、对结构体一级排序

struct Sample
{
double data;
int other;
}s[100];

//按照data的值从小到大将结构体排序

int cmp( const void *a ,const void *b)
{
return (Sample *)a->data (Sample *)b->data ;
}

qsort(s,100,sizeof(s[0]),cmp);

五、对结构体二级排序

struct Sample
{
int x;
int y;
}s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序

int cmp( const void *a , const void *b )
{
struct Sample *c = (Sample *)a;
struct Sample *d = (Sample *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}

qsort(s,100,sizeof(s[0]),cmp);

六、对字符串进行排序

struct Sample
{
int data;
char str[100];
}s[100];

//按照结构体中字符串str的字典顺序排序

int cmp ( const void *a , const void *b )
{

return strcmp( (*(Sample *)a)->str , (*(Sample *)b)->str );
}

qsort(s,100,sizeof(s[0]),cmp);

可以看到以上的排序,除了比较函数不同外,其它都是一样的,其实qsort的精华就在比较函数,通过比较函数就可以实现复杂的排序了。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter