2014-09-28 3 views
-2

У меня есть задача отсортировать точки с тремя измерениями, а затем показать их на экране. Они разделены пробелами. Есть ли более быстрый способ, чем мой?Сортировка 3d-точек

Могу ли я каким-то образом разместить это в трехмерном массиве и выполнить какую-то функцию сортировки?

#include <iostream> 
using namespace std; 
int x[1001], y[1001], z[1001]; 
int main() 
{ 
int t; // how many points 
cin>>t; 
for(int counter=0; counter<t; counter++) 
{ 
    cin>>x[counter]>>y[counter]>>z[counter]; 
} 

//sorting 

for(int i=0; i<t; i++) 
{ 
    for(int j=0; j<t; j++) 
    { 
     if(x[j]>=x[j+1]) 
     { 
      int tx, ty, tz; 
      tx=x[j]; 
      x[j]=x[j+1]; 
      x[j+1]=tx; 
      ty=y[j]; 
      y[j]=y[j+1]; 
      y[j+1]=ty; 
      tz=z[j]; 
      z[j]=z[j+1]; 
      z[j+1]=tz; 
     } 
     if(x[j]==x[j+1]) 
     { 
      if(y[j]>=y[j+1]) 
      { 
       int ty, tz; 
       ty=y[j]; 
       y[j]=y[j+1]; 
       y[j+1]=ty; 
       tz=z[j]; 
       z[j]=z[j+1]; 
       z[j+1]=tz; 
      } 
     } 
     if(x[j]==x[j+1] && y[j]==y[j+1]) 
     { 
      if(z[j]>=z[j+1]) 
      { 
       int tz; 
       tz=z[j]; 
       z[j]=z[j+1]; 
       z[j+1]=tz; 
      } 
     } 
    } 
} 

//showing results 
for(int counter=1; counter<=t; ++counter) 
{ 
    cout<<x[counter]<<" "<<y[counter]<<" "<<z[counter]<<endl; 
} 
} 
+1

'if (x [j] == x [j + 1])' (и то же самое в следующем тесте) может быть неверным для вашего ввода. – usr2564301

ответ

9

Этот вопрос имеет C++ -Tag. struct, std::vector и std::sort являются читаемыми/простыми и быстрыми.

struct Point { 
    int x; 
    int y; 
    int z; 
    Point() {} 
    Point(int x, int y, int z) : x(x), y(y), z(z) {} 

    bool operator<(const Point &o) const { 
     if (x != o.x) { 
      return x < o.x; 
     } 
     if (y != o.y) { 
      return y < o.y; 
     } 
     return z < o.z; 
    } 
}; 

#include <iostream> 
#include <algorithm> 

std::vector<Point> points; 

int main() { 
    int t; // how many points 
    std::cin >> t; 
    points.reserve(t); 
    for(int counter = 0; counter < t; counter++) { 
     int x, y, z; 
     std::cin >> x >> y >> z; 
     points.push_back(Point(x, y, z)); 
    } 

    std::sort(points.begin(), points.end()); 

    for(int counter = 0; counter < t; ++counter) { 
     std::cout << points[counter].x << " " 
        << points[counter].y << " " 
        << points[counter].z << std::endl; 
    } 
} 
2

Да, есть более быстрые способы, чем ваш метод. В частности, вы используете Insertion Sort для вашего алгоритма сортировки. Более быстрый алгоритм - Mergesort или Quicksort.

Быстрее всего было бы использовать 2D-массив, а затем предоставить метод сортировки библиотеки с помощью специальной функции сравнения. Это упростит чтение кода и воспользуется оптимизацией в пределах sort().

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