繁体   English   中英

平面坐标点排序

[英]plane coordinate point sorting

我们有一组坐标点(x,y),它们是整数。

如何按x坐标对其进行排序,然后打印所有坐标点。

我们使用两个数组分别存储坐标点。

就是x[0] x[1]...x[n-1]

y[0] y[1]...y[n-1]

和( x[0] y[0]) (x[1] y[1])...(x[n-1] y[n-1] )是我们需要排序的坐标点。

问题是,当我使用排序算法对数组x[0] x[1]...x[n-1]进行排序时,结果是一个新的排序数组x[0] x[1]...x[n-1] ,我不知道排序数组x[0] x[1]...x[n-1]的对应y。

请告诉我该如何处理? 我可以使用其他方式存储坐标点吗?

为什么不创建一个结构的新数组(如果可能,它可以替换x和y数组),而每个结构同时存储x和y? 就像是

struct point {
    int x, y;
};

struct point points[N];

有两种简单的方法可以做到这一点:

  1. 使用结构作为重点

    struct point { int x, y; }

    在这种情况下,您可以有一个数组struct point points[NUM_POINTS] ,也可以在排序算法中的任何位置,如果说if a[n] < a[m]而不是说if a[n].x < a[m].x

  2. 由于无论如何您都必须修改排序算法,所以如果您不想使用结构(说实话,这是我推荐的方式)。 您可以更改排序算法,使其采用两个数组,并且在每次执行swap(xArray,n,m)操作时,都可以添加swap(yArray,n,m)。 根据您使用的算法,这可能会成为一个主要麻烦。

  3. 2的通用版本将具有两个数组:可排序的数组和与从0到ArrayLen-1顺序编号的可排序数组大小完全相同的数组之一。 与2中一样,每当在可排序数组上交换(m,n)时,也在索引数组上交换(m,n)。 完成此操作后,以相同的方式对您需要的所有其他数组进行排序,并将sideArray [i]中的每个元素放入indexArray [i]中列出的索引中(通常需要复制到新数组中)。

总体而言,将数据放入结构中通常是最好的,而到目前为止,最简单的是,尤其是出于您的目的,尽管在某些情况下3是必需的(但通常仅当您在输入约束严格的某些库中工作时)。

您可以通过从索引对两个序列的索引关系进行排序来间接排序。

下面的例子

#include <stdio.h>
#include <stdlib.h>

int *X;

int cmp(const void *a, const void *b){
    int xi = *(int *)a;
    int xj = *(int *)b;
    return (X[xi] < X[xj]) ? -1 : (X[xi] > X[xj]);
}

int main(){
    int x[] = { 1, 4, 2, 5, 3, 7, 10 };
    int y[] = { 5, 2, 4, 3, 8, 9, 99 };
    size_t size = sizeof(x)/sizeof(*x);
    int index[size];
    int i;
    for(i = 0; i < size ; ++i){
        index[i]=i;
    }
    X = x;
    qsort(index, size, sizeof(int), cmp);
    for(i=0;i<size;++i){
        printf("(%d, %d)\n", x[index[i]], y[index[i]]);
    }
    return 0;
}

首先,根据x坐标对点进行排序,如果存在相同的x坐标,则根据y坐标对相同的点进行排序

#include <bits/stdc++.h>
using namespace std;
struct point
{
    int x,y;
};


int main()
{
    struct point a[100],tmp;
    int i,j,n;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>a[i].x>>a[i].y;
    }
    //sort according to x co-ordinate
    for(i=1;i<=n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            if(a[i].x>a[j].x)
            {
                tmp=a[i];
                a[i]=a[j];
                a[j]=tmp;
            }
        }
    }
    //sort according to y when x points are same 
    for(i=1;i<=n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            if(a[i].x==a[j].x)
            {
            if(a[i].y>a[j].y)
            {
                tmp=a[i];
                a[i]=a[j];
                a[j]=tmp;
            }
            }
        }
    }

    for(i=1;i<=n;i++)
    {
       cout<<a[i].x<<" "<<a[i].y<<endl;

    }
    return 0;

}

比较时,仅比较x个数组值,但交换时,交换两个数组值,

if(x[i] > x[j]){
    swap(x[i],x[j])
    swap(y[i],y[j])
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM