2015-03-06 3 views
-1

Моя программа задана точками сортировки на плоскости x-y, заданной пользователем, в соответствии с их расстоянием от начала координат с использованием сортировки ковша. В случае наличия двух точек с одинаковым расстоянием в качестве первой точки будет выбрана точка с наименьшей координатой x. Если и расстояние, и координата x одинаковы, первым будет элемент с наименьшей координатой y. Вывод - это сами точки, а не их расстояния. Наиболее логичным способом, который я нашел для этого до сих пор, является создание пользовательской структуры данных, в которой хранятся как координата x, так и координата y, и ее расстояние в одном элементе. Проблема, которую я сейчас имею в виду, это мой текущий алгоритм для стандартных векторов двойников, и я не знаю, как преобразовать сортировку в соответствии с моими потребностями. Любые идеи или предложения были бы полезными.Ведро Сортировка с пользовательской структурой данных

Вот макет структуры:

struct point { 
double xc; 
double yc; 
double dist; }; 

Текущее ведро сортировка, который отлично работает с векторами двойников.

void bucketSort(vector<double> &arr) { 
    int n = B.size(); 
    vector<point> b[n]; 

    for (int i=0; i<n; i++) 
    { 
     int bi = n*arr[i]; 
     b[bi].push_back(arr[i]); 
    } 

    for (int i=0; i<n; i++) 
     sort(b[i].begin(), b[i].end()); 

    int index = 0; 
    for (int i = 0; i < n; i++){ 
     for (int j = 0; j < b[i].size(); j++){ 
      arr[index++] = b[i][j]; } 
     } 
    } 

Полный код, на данный момент.

using namespace std; 

struct point { 
    double xc; 
    double yc; 
    double dist; 
}; 

vector<double> A; 
vector<double> B; 

double findDistance(double x = 0, double y = 0) { 
    double x2 = pow(x, 2); 
    double y2 = pow(y, 2); 
    double z = x2 + y2; 
    double final = sqrt(z); 
    return final; 
} 

void bucketSort(vector<double> &arr) 
{ 
    int n = B.size(); 
    vector<point> b[n]; 

    for (int i=0; i<n; i++) 
    { 
     int bi = n*arr[i]; 
     b[bi].push_back(arr[i]); 
    } 

    for (int i=0; i<n; i++) 
     sort(b[i].begin(), b[i].end()); 

    int index = 0; 
    for (int i = 0; i < n; i++){ 
     for (int j = 0; j < b[i].size(); j++){ 
      arr[index++] = b[i][j]; } 
     } 
    } 

int main(){ 
    double number; int t = 0; 
    while (cin >> number){ 
     A.push_back(number); } 
    struct point C[A.size()]; 
    while (t < A.size()){ 
     C[t/2].xc = A[t]; C[t/2].yc = A[t + 1]; 
     C[t/2].dist = (findDistance(A[t], A[t + 1])); t += 2; } 
    cout << setprecision(6); cout << fixed; ; 
    bucketSort(C); 
    cout << showpos; cout << fixed; 
    int x = 0; 
    while (x < (A.size()/2)){ 
     cout << C[x].xc << " " << C[x].yc << endl; 
     x++; 
    } 
} 

вектор двойников B здесь потому, что на начальном этапе, я пытался сделать это с несколькими векторами двойников.

Вот образец ввода:

0.2 0.38 
0.6516 -0.1 
-0.3 0.41 
-0.38 0.2 

Пример вывода:

-0.380000 +0.200000 
+0.200000 +0.380000 
-0.300000 +0.410000 
+0.651600 -0.100000 

Я понимаю, что точка может иметь гораздо больше функций, добавленных к нему, чтобы сделать его более удобным для использования в целом, но я стремлюсь к тому, чтобы получить текущую работу. Любые предложения или помощь будут очень признательны. Пожалуйста и спасибо.

+0

Да, мой плохой. Добавлены теги. –

ответ

-1

Я хотел бы предложить один из вариантов там 2 -

  1. грим точку класса, а не структура, и перегружает оператор <, что делает работу хорошо сортировки.

2.Используйте сортировать по функции вместо нормального вида:

Во-первых, добавить функцию сравнения:

bool comparePoint(point* a, point* b) { 
    return true if a < b; 
} 

функция выше будет сравнивать 2 балла, в соответствии с любыми правилами вам нравится, зависит от вашего кода.

и вместо использования сортировки:

std::sort(b[i].begin(), b[i].end(),comparePoint); 

, которые должны работать для вас.

Смежные вопросы