极角排序

先判象限再判叉积,如此而已。

#include <cstdio>
#include <cstdlib>

struct point
{
       int x,y,b;
};

point a[1000];
int n;

int cro(point e,point r)
{
  //  if (e.b!=r.b) return (e.b-r.b);
    return (e.x*r.y)-(e.y*r.x);
}

void qs(int l,int r)
{
     int i=l,j=r;
     point c;
     point x=a[(l+r)/2];
     for (;!(i>j);)
     {
         for (;cro(a[i],x)>0;i++) ;
         for (;cro(x,a[j])>0;j--) ;
         if (!(i>j))
         {
                  c=a[i],a[i]=a[j],a[j]=c;
                  i++,j--;
         }
     }
     if (i<r) qs(i,r);
     if (l<j) qs(l,j);
 }

void init()
{
     int i;
     n=1;
     while (scanf("%d%d",&a[n].x,&a[n].y)!=EOF)
     {
//         scanf("%d%d",&a[i].x,&a[i].y);
         if ((a[n].x>=0)&&(a[n].y>0)) a[n].b=2;
         if ((a[n].x<0)&&(a[n].y>=0)) a[n].b=1;
         if ((a[n].x<=0)&&(a[n].y<0)) a[n].b=4;
         if ((a[n].x>0)&&(a[n].y<=0)) a[n].b=3;
         n++;            
      }
     n--; 
  	for (i = 1; a[i].x != 0 || a[i].y != 0 ; i++ )
	point tmp = a[i]; a[i] = a[1]; a[1] = a[i]; 
     qs(2,n);
//     printf("(0,0)\n");
     for (i=1;i<=n;i++)
     {
  /*       if ((a[i].x!=0)||(a[i].y!=0))
         {*/
            printf("(%d,%d)\n",a[i].x,a[i].y);                                                                         
//         }
     }
 }

int main()
{
    freopen("2007.in","r",stdin);
    freopen("2007.out","w",stdout);
    init();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值