qsort排序 转载

来源:互联网 发布:单片机封装 编辑:程序博客网 时间:2024/06/06 00:40
qsort排序方法

2008-02-26 15:07

前一段时间做题觉得qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等,故通过查资料将其整理一番。

以下是其具体分类及用法(若无具体说明是以降序排列):

1、对一维数组排序:

(Element_type是一位数组中存放的数据类型,可以是char, int, float, double, etc )

int Comp(const void *p1,const void *p2 )

{

return *((Element_type *)p2)-*((Element_type *)p1);

}

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[0]),Comp);

//lenth 为数组a的长度

3、按结构体中某个关键字排序(对结构体一级排序):

struct Node

{

double data;

int other;

}s[100];

int Comp(const void *p1,const void *p2)

{

return (*(Node *)p2)->data-(*(Node *)p1)->data;

}

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

4、按结构体中多个关键字排序(对结构体多级排序)[以二级为例]:

struct Node

{

int x;

int y;

}s[100];

//按照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[100];

}s[100];

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

int Comp(const void *p1,const void *p2)

{

return strcmp((*(Node *)p1)->str,(*(Node *)p2)->str);

}

qsort(s,100,sizeof(s[0],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[1]) < 0) return 1;

else if(!cacl(*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;

}

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。

使用C++标准库的快速排序函数

tytzyl    发表于2009年03月25日 14:30 阅读(3) 评论(0) 分类: [url=javascript:;]个人日记 [/url]

[url=javascript:;]六类qsort排序方法 - 小熊 - justly@yeah 的博客举报[/url]六类qsort排序方法 - 小熊 - justly@yeah 的博客六类qsort排序方法 - 小熊 - justly@yeah 的博客 好久没有用快速排序了,虽然以前常用,但是现在由于专业的关系用的少了,但这并不能减少我对算法的热爱!

C++的标准库stdlib.h中提供了快速排序函数。

请在使用前加入对stdlib.h的引用:#include <cstdlib> 或 #include <stdlib.h>

qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2))

参数表

*base: 待排序的元素(数组,下标0起)。

num: 元素的数量。

width: 每个元素的内存空间大小(以字节为单位)。可用sizeof()测得。

int(*)compare: 指向一个比较函数。*elem1 *elem2: 指向待比较的数据。

比较函数的返回值

返回值是int类型,确定elem1与elem2的相对位置。

elem1在elem2右侧返回正数,elem1在elem2左侧返回负数。

控制返回值可以确定升序/降序。

一个升序排序的例程:

int Compare(const void *elem1, const void *elem2)

{

return *((int *)(elem1)) - *((int *)(elem2));

}

int main()

{

int a[100];

qsort(a, 100, sizeof(int), Compare);

return 0;

qsort中的const 关键字

TigerBlue    发表于2008年10月27日 21:50 阅读(22) 评论(0) 分类: [url=javascript:;]个人日记 [/url]来源:QQ邮箱

[url=javascript:;]六类qsort排序方法 - 小熊 - justly@yeah 的博客举报[/url]六类qsort排序方法 - 小熊 - justly@yeah 的博客六类qsort排序方法 - 小熊 - justly@yeah 的博客 cosnt char *p1; //p1 is a pointer to const char

char *const p2;// p2 is a const pointer to char

char * const *p3;// p3 is a pointer to const pointer to char

const * char *p4;// 没有这种用法。

void qsort(void *base, size_t nmemb, size_t size, int (*comp)(const void *, const void *));

static int (*comp)(const void *q1, const void *q2)

{

//真正传进来的是pointer to pointer to char,

         return strcmp(*(char * const *)q1, *(char * const *)q2);

//将char ** 转化为char * const *,然后求值,即为char * const ,argv的值是不允许改的,然后传给strcmp

}

而strcmp的原型为 int strcmp(const char *q3, const char *q4);

将char * const 转化为const char *,即 argv指向的字符串是不允许改的。

整个过程确保传进来的内容只读,不能修改,全靠 const这个关键字。

<本文中排序都是采用的从小到大排序>

一、对int类型数组排序

int num[100];

Sample:

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];

Sample:

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

{

return *(char *)a - *(int *)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 In

{

double data;

int other;

}s[100]

//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很

多种,参考上面的例子写

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

{

return ((In *)a)->data > ((In *)b)->data ? 1 : -1;

}

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

五、对结构体二级排序

struct In

{

int x;

int y;

}s[100];

//按照x从小到大排序,当x相等时按照y从大到小排序

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

{

struct In *c = (In *)a;

struct In *d = (In *)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 In

{

int data;

char str[100];

}s[100];

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

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

{

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

}

qsort(s,100,sizeof(s[0]),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;

}

PS:

其中的qsort函数包含在<stdlib.h>的头文件里,strcmp包含在<string.h>的头文件里

0 0
原创粉丝点击