平面坐标点排序

时间:2013-12-18 11:31:44

标签: c sorting

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

如何按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],我无法知道排序数组{{1}中的相应y }}

请告诉我怎么处理它?我可以使用其他方式存储坐标点吗?

5 个答案:

答案 0 :(得分:3)

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

这样的东西
struct point {
    int x, y;
};

struct point points[N];

答案 1 :(得分:2)

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

  1. 使用结构

    struct point { int x, y; }

    在这种情况下,您可以拥有数组struct point points[NUM_POINTS],以及排序算法中的任何位置 你说if a[n] < a[m]代替if a[n].x < a[m].x

  2. 因为你不得不修改你的排序算法,如果你不想使用结构(老实说我推荐的方式)。您可以更改排序算法,使其占用两个数组,并且无论您在何处执行操作交换(xArray,n,m),都可以添加交换(yArray,n,m)。根据您使用的算法,这可能会成为一个主要的麻烦。

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

  4. 总的来说,将数据放在结构中通常是最好的,而且到目前为止最简单,特别是对于您的目的,尽管在某些情况下需要3(但通常只有当您在某些具有严格输入约束的库中工作时)

答案 2 :(得分:1)

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

以下示例

#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;
}

答案 3 :(得分:0)

首先根据x坐标对点进行排序,然后根据y坐标,如果有相同的x坐标排序相同的点

#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;

}

答案 4 :(得分:0)

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

public FileResult ReadMe()
{
    string filename = "ReadMe_2.1.txt";
    string serverpath = Server.MapPath("~/Download/");
    string filepath = serverpath + filename;

    return File(filepath, System.Net.Mime.MediaTypeNames.Application.Octet, filename);
}