我们有一组坐标点(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 }}
请告诉我怎么处理它?我可以使用其他方式存储坐标点吗?
答案 0 :(得分:3)
为什么不在每个结构同时存储x和y的结构中创建一个新数组(如果可能的话,可以替换x和y数组)?像
这样的东西struct point {
int x, y;
};
struct point points[N];
答案 1 :(得分:2)
有几种简单的方法可以做到这一点:
使用结构
struct point {
int x, y; }
在这种情况下,您可以拥有数组struct point
points[NUM_POINTS]
,以及排序算法中的任何位置
你说if a[n] < a[m]
代替if a[n].x < a[m].x
因为你不得不修改你的排序算法,如果你不想使用结构(老实说我推荐的方式)。您可以更改排序算法,使其占用两个数组,并且无论您在何处执行操作交换(xArray,n,m),都可以添加交换(yArray,n,m)。根据您使用的算法,这可能会成为一个主要的麻烦。
2的通用版本是两个数组:可排序的数组和一个与可排序数组完全相同的数组,按照从0到ArrayLen-1的顺序编号。与2中一样,无论何时在可排序数组上交换(m,n),还要在索引数组上交换(m,n)。完成此操作后,将所需的每个其他数组以相同的方式排序,并将sideArray [i]中的每个元素放在indexArray [i]中列出的索引中(通常需要复制到新数组)。
总的来说,将数据放在结构中通常是最好的,而且到目前为止最简单,特别是对于您的目的,尽管在某些情况下需要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);
}