2010-08-26 9 views
7

Angenommen, wir haben das folgende Problem - wir wollen eine Reihe von (x, y) Koordinaten und einen Namen lesen, dann sortieren sie in der Reihenfolge, indem Sie den Abstand vom Ursprung (0, 0). Hier ist ein Algorithmus, der einfachste Blase Art verwenden:Finden Sie den nächsten Ort vom ursprünglichen Punkt

#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; 
    } 

Aber ich will STL Sortieralgorithmus statt Blase Art schreiben. Wie geht das?

Ich meine, wie soll ich dist-Funktion in STL-Sortieralgorithmus verwenden?

Antwort

8

Die STL-Sortierfunktion std::sort kann eine benutzerdefinierte Vergleichsfunktion (oder ein Funktionsobjekt) als optionales drittes Argument verwenden. Also, wenn Sie Ihre Einzelteile in zB haben:

vector<point> points; 

Sie können sortieren sie durch den Aufruf:

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

wo my_comp() ist eine Funktion mit dem folgenden Prototyp:

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

+ 1. Wenn "Punkt" groß ist, kann es effizienter sein, wenn "my_sort()' const-Referenzen auf "point" nimmt, anstatt die Objekte zu kopieren. –

+0

Guter Anruf. Antwort aktualisiert entsprechend. –

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); 
Verwandte Themen