Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

find nearest location from original point

Tags:

c++

Suppose we have the following problem - we want to read a set of (x, y) coordinates and a name, then sort them in order, by increasing the distance from the origin (0, 0). Here is an algorithm which use simplest bubble sort:

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

But I want to write STL sorting algorithm instead of bubble sort. How to do so?

I mean that, how should I use dist function in STL sort algorithm?

like image 524
dato datuashvili Avatar asked Aug 26 '10 21:08

dato datuashvili


People also ask

Which data structure would you use to query the K nearest points of a set on a 2d plane?

A KD Tree does the job. It's a geometric data structure that can find nearest neighbors efficiently by cutting the search space similarly to a binary search.


1 Answers

The STL sort function std::sort can take a user-defined comparison function (or function object) as an optional third argument. So if you have your items in e.g.:

vector<point> points;

You can sort them by calling:

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

where my_comp() is a function with the following prototype:

bool my_comp(const point &a, const point &b)
like image 171
Oliver Charlesworth Avatar answered Oct 31 '22 16:10

Oliver Charlesworth