2010-08-26 76 views
7

Giả sử chúng ta có vấn đề sau - chúng ta muốn đọc tập hợp tọa độ (x, y) và tên, sau đó sắp xếp chúng theo thứ tự, bằng cách tăng khoảng cách từ gốc (0, 0). Đây là một thuật toán sử dụng loại bong bóng đơn giản nhất:tìm vị trí gần nhất từ ​​điểm gốc

#include<iostream> 
    #include <algorithm> 
    using namespace std; 
    struct point{ 
     float x; 
     float y; 
     char name[20]; 

     }; 
     float dist(point p){ 
      return p.x*p.x+p.y*p.y; 
      } 
     void sorting(point pt[],int n){ 
      bool doMore = true; 
     while (doMore) { 
      doMore = false; // Assume no more passes unless exchange made. 
      for (int i=0; i<n-1; i++) { 
       if (dist(pt[i]) > dist(pt[i+1])) { 
        // Exchange elements 
        point temp = pt[i]; pt[i] = pt[i+1]; pt[i+1] = temp; 
        doMore = true; // Exchange requires another pass. 
       } 
      } 
     } 

     } 
     void display(point pt[],int n){ 
      for (int i=0;i<n;i++){ 
       cout<<pt[i].name<< " "; 
        } 
     } 
    int main(){ 
    point pts[1000]; 
    int n=0; 

    while (cin>>pts[n].name>>pts[n].x>>pts[n].y){ 
     n++; 

    } 
    sorting(pts,n); 
    display(pts,n); 

    return 0; 
    } 

Nhưng tôi muốn viết thuật toán sắp xếp STL thay vì sắp xếp bong bóng. Làm thế nào để làm như vậy?

Tôi có nghĩa là, làm thế nào tôi nên sử dụng chức năng dist trong thuật toán sắp xếp STL?

Trả lời

8

Chức năng sắp xếp STL std::sort có thể lấy hàm so sánh do người dùng xác định (hoặc đối tượng hàm) làm đối số thứ ba tùy chọn. Vì vậy, nếu bạn có các mục của bạn trong ví dụ:

vector<point> points; 

Bạn có thể sắp xếp chúng bằng cách gọi:

sort(points.begin(), points.end(), my_comp); 

nơi my_comp() là một chức năng với nguyên mẫu sau:

bool my_comp(const point &a, const point &b) 
+1

+ 1. Nếu 'điểm' là lớn, nó có thể hiệu quả hơn để có' my_sort() 'lấy tham chiếu const tới' điểm' thay vì sao chép các đối tượng. –

+0

Cuộc gọi tốt. Trả lời được cập nhật tương ứng. –

2
#include <algorithm> 

bool sort_by_dist(point const& p1, point const& p2) { 
    return dist(p1) < dist(p2); 
} 

... 

std::sort(pt, pt + n, sort_by_dist); 
Các vấn đề liên quan