排序坐标点c ++

时间:2011-08-27 16:26:44

标签: c++ algorithm data-structures array-algorithms

在一个应用程序中我测量了很多a的2d坐标(x,y) 图案。此模式由一组固定的网格点组成 在x和y方向上的音高。这些坐标都有得分 质量,并按此分数排序。我想做的是排序 这些坐标首先在x上,并定义组的(组) 属于一起的x坐标。在这一步之后我想排序 y区域中不同的x区域。

在此之后,我能够将坐标标记为相应的 模式(网格)标签。

示例:测量坐标 (x,y)=(2,2),(2,3),(1,2),(1,3),(2,1),(1,1),(3,2),(3 ,3),(3,1)

在第1步之后: (x,y)=(1,2),(1,3),(1,1)(2,2),(2,3),(2,1)(3,2),(3,3) ),(3,1)

在第2步之后: (x,y)=(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3 ,2),(3,3)

是否有已执行此任务的排序例程?例程 如果不测量图案的某些坐标,也应该有效。

有人可以给我一些线索,我不是一个经验丰富的c ++ 程序员,但也许有一些提示我可以做这个工作!

3 个答案:

答案 0 :(得分:8)

您需要一个稳定的排序算法(不会改变相等元素的顺序)。首先按y坐标进行排序,然后按x进行排序,以获得所需的结果:

std::stable_sort(points.begin(), points.end(), yComparator());
std::stable_sort(points.begin(), points.end(), xComparator());

例如:
之前:(x,y)=(2,2),(2,3),(1,2),(1,3),(2,1),(1,1),(3,2), (3,3),(3,1)
按y排序:(x,y)=(2,1),(1,1),(3,1),(2,2),(1,2),(3,2),(2,3) ),(1,3),(3,3)
按x排序:(x,y)=(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1 ),(3,2),(3,3)

答案 1 :(得分:5)

您可以使用std::sort和自定义operator<执行此操作,例如:

#include <algorithm>
#include <vector>

struct coord {
  double x,y,quality;
};

bool operator<(const coord& a, const coord& b) {
  return a.quality < b.quality;
}

int main() {
  std::vector<coord> coords;
  std::sort(coords.begin(), coords.end());
}

如果您不希望将“质量”存储在结构中,您可以随时调用某个函数直接在operator<中计算它,例如:

double quality(const coord& c);

bool operator<(const coord& a, const coord& b) {
  return quality(a) < quality(b);
}

答案 2 :(得分:3)

如果您知道数字的范围,可以将X乘以一个大数字,然后将y加到该数字上。现在您只需对该单个数字进行排序,或者您可以像其他人所描述的那样使用stl库来执行此操作。