本文主要是介绍六类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);
}
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>的头文件里
这篇关于六类qsort排序方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!