先判象限再判叉积,如此而已。
#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;
}