[英]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];
有两种简单的方法可以做到这一点:
使用结构作为重点
struct point { int x, y; }
在这种情况下,您可以有一个数组struct point points[NUM_POINTS]
,也可以在排序算法中的任何位置,如果说if a[n] < a[m]
而不是说if a[n].x < a[m].x
由于无论如何您都必须修改排序算法,所以如果您不想使用结构(说实话,这是我推荐的方式)。 您可以更改排序算法,使其采用两个数组,并且在每次执行swap(xArray,n,m)操作时,都可以添加swap(yArray,n,m)。 根据您使用的算法,这可能会成为一个主要麻烦。
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.