hoj 3276 快排之点的排序

来源:互联网 发布:碑文 软件 编辑:程序博客网 时间:2024/05/20 18:48

Problem Description

二维平面点的排序

给定二维平面上的n个点,按照x从小到大的顺序排列,如果两个点的x大小相同,那么y较小的那个排在前面。

Input

多组数据。

第一行是一个整数n(n <= 100000),表示有n个点。

接下来有n行,每行两个整数xi和yi(int32表示范围内),分别表示第i个点的x坐标和y坐标。保证输入数据中没有重复的两个点。

Output

输出一行,表示排好序的点在原来的数组中的下标。(假设下标从0开始)

数字与数字之间用空格分隔,最后一个数字后面没有空格。

Sample Input

2

4 4

3 3

Sample Output

1 0

感谢张恩上同学的提醒。

#include <stdio.h>#include <stdlib.h>#define Point struct pointstruct point{        int x;        int y;        int i;   };void quick_sort(Point arr[],int beg,int ed){    if(beg >= ed) return ;    int left = beg,right = ed;    int tmp1 = arr[left].x;    int tmp2 = arr[left].y;    int tmp3 = arr[left].i;    while(left < right)    {        while(left < right && (arr[right].x > tmp1|| (arr[right].x == tmp1 && arr[right].y > tmp2))) right --;        if(left < right)        {            arr[left].x = arr[right].x;            arr[left].y = arr[right].y;            arr[left].i = arr[right].i;            left ++;        }        while(left < right && (arr[left].x < tmp1 || (arr[left].x == tmp1 && arr[left].y < tmp2))) left ++;        if(left < right)        {            arr[right].x = arr[left].x;            arr[right].y = arr[left].y;            arr[right].i = arr[left].i;            right --;        }    }    arr[left].x = tmp1;    arr[left].y = tmp2;    arr[left].i = tmp3;    quick_sort(arr,beg,left - 1);    quick_sort(arr,left + 1,ed);}int main(){    struct point arr[100010];    int n,i;    while(scanf("%d",&n) != EOF && n!= 0)    {        for(i = 0;i < n; i++)        {            scanf("%d %d",&arr[i].x,&arr[i].y);            arr[i].i = i;        }        quick_sort(arr,0,n-1);        for(i = 0;i < n - 1; ++i)         {             printf("%d ",arr[i].i);         }        printf("%d",arr[i].i);        printf("\n");    }    return 0;}