ACM排序

ACM比赛中排序方法

1.C的qsort

#include <stdlib.h>

代码:

int cmp(const void *p,const void *q)

{

return *((int *)p)-*((int *)q);

}

qsort(array,n,sizeof(array[0]),cmp)

六类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[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 ? 1 : -1;

}

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;

}

2.C++的Sort

#include <algorithm>

代码:

sort(array,array+n)

手写排序,根据题目要求选择合适的排序方法

std::sort(begin, end)
是快速排序,begin是带排序序列第一个元素,end是最后一个元素后面的标志。

      简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。需要对数组t的第0到len-1的元素排序,就写sort(t,t+len);

      排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。

      如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp
bool cmp(int a,int b)
{
    return a>b;
}
   排序的时候就写sort(a,a+100,cmp);

     假设自己定义了一个结构体node
struct node{
    int a;
    int b;
    double c;
                  }
   有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数:
以下是代码片段:
bool cmp(node x,node y)
{
     if(x.a!=y.a) return x.a>x.b;

           if(x.b!=y.b) return x.b>y.b;
     return return x.c>y.c;
}     排序时写sort(arr,a+100,cmp);



如果要排序的是vector,那么可以写成std::sort(v.begin(),v.end());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值