В приложении я измеряю множество двухмерных координат (x, y) шаблона. Этот шаблон состоит из набора точек на сетке с фиксированными шагами в направлениях x и y. Все эти координаты имеют оценку качества и сортируются по этой оценке. Я хочу сначала отсортировать эти координаты по x и определить группы (области) x-координат, которые принадлежат друг другу. После этого шага я хочу отсортировать различные x-регионы в y-регионах.

После этого я могу пометить координаты соответствующей меткой шаблона (сетки).

Пример: Измеренные координаты (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 ++, но, возможно, с некоторыми подсказками я справлюсь с этой работой!

7
Nichole Grace 27 Авг 2011 в 20:26

3 ответа

Лучший ответ

Если вы знаете диапазон ваших чисел, вы можете умножить X на какое-то большое число, а затем добавить y к этому числу. Теперь вы можете просто отсортировать это число или использовать библиотеку stl, чтобы сделать это, как описано другими.

4
SamFisher83 27 Авг 2011 в 16:38

Вам нужен стабильный алгоритм сортировки (ведьма не меняет порядок равных элементов). Сначала выполните сортировку по координате 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)

11
Andrey Kamaev 27 Авг 2011 в 16:39

Вы можете сделать это с помощью 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);
}
6
Flexo 27 Авг 2011 в 16:33