2014-09-28 3 views
-2

3 차원으로 포인트를 정렬 한 다음 화면에 표시하는 작업이 있습니다. 그들은 공백으로 구분됩니다. 저보다 빠른 방법이 있습니까?3D 포인트 정렬

어떻게하면 3 차원 배열에 배치하고 일종의 정렬 기능을 수행 할 수 있습니까?

#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::vectorstd::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

예, 방법보다 빠른 방법이 있습니다. 특히 정렬 알고리즘에 삽입 삽입을 사용하고 있습니다. 보다 빠른 알고리즘은 Mergesort 또는 Quicksort입니다.

더 빨리 2D 배열을 사용하고 사용자 정의 비교 함수를 사용하여 라이브러리 정렬 방법을 제공하십시오. 이렇게하면 코드를 더 쉽게 읽고 sort() 내의 최적화를 이용할 수 있습니다.

관련 문제