Witam mam do posortowania wektor punktów w czasie nlogn a najlepiej jakbym użył funkcji sort() z STL.
Niestety gdy chce użyć sortowania program się nie kompiluje a przeciążyłem operator > i < do sortowania.
Nie wiem co dokładnie robię źle więc proszę o wskazówki i pomoc.
Klasa i przeciążenie
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <list>
#include<ctime>
using namespace std;
class Point
{
public:
double x;
double y;
bool operator<(Point &p)
{
if(x<p.x)
return true;
if(x==p.x)
if(y<p.y)
return true;
else
return false;
if(x>p.x)
return false;
}
bool operator>(Point &p)
{
if(x>p.x)
return true;
if(x==p.x)
if(y>p.y)
return true;
else
return false;
if(x>p.x)
return false;
}
};
//takie cos probuje uzyc w programie i sie nie kompiluje
//p to jest vector<Point>;
sort(p.begin(),p.end());
Cały kod:
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <list>
#include<ctime>
using namespace std;
class Point
{
public:
double x;
double y;
bool operator<(Point &p)
{
if(x<p.x)
return true;
if(x==p.x)
if(y<p.y)
return true;
else
return false;
if(x>p.x)
return false;
}
bool operator>(Point &p)
{
if(x>p.x)
return true;
if(x==p.x)
if(y>p.y)
return true;
else
return false;
if(x>p.x)
return false;
}
};
bool zakret(Point p1, Point p2, Point p3)
{
double wyznacznik=0.0;
wyznacznik=(((p3.x-p1.x)*(p2.y-p1.y))-((p3.y-p2.y)*(p2.x-p1.x)));
if(wyznacznik>0)
return true;
if(wyznacznik<0)
return false;
}
int main()
{
srand(time(NULL));
clock_t poczatek, koniec;
double time;
vector<Point> p;
int ile=0;
cout<<"Ile punktow: "; cin>>ile;
Point punkt1;
cout<<"\nPrzed sortowaniem"<<endl;
for(int i=0; i<ile;i++)
{
punkt1.x=double(0.0+rand() % 1000);
punkt1.y=double(0.0+rand() % 1000);
// cout<<"Punkt "<<i<<": x="<<punkt1.x<<", y="<<punkt1.y<<endl;
p.push_back(punkt1);
}
poczatek=clock();
//sort(p.begin(),p.end());
vector<Point> s1;
vector<Point> s2;
s1.push_back(p[0]);
s1.push_back(p[1]);
cout<<"\nOtoczka gorna: ";
for(int i=2; i<p.size();i++)
{
s1.push_back(p[i]);
while(s1.size()>=2 && zakret(s1[s1.size()-2], s1[s1.size()-1], p[i])==0)
{
punkt1=s1[s1.size()-1];
s1.pop_back();
cout<<"x="<<punkt1.x<<", y="<<punkt1.y<<endl;
}
}
s2.push_back(p[p.size()-1]);
s2.push_back(p[p.size()-2]);
cout<<"\nOtoczna dolna: ";
for(int i=p.size()-3; i>0 ;i--)
{
s2.push_back(p[i]);
while(s2.size()>=2 && zakret(s2[s2.size()-2], s2[s2.size()-1], p[i])==0)
{
punkt1=s2[s2.size()-1];
s2.pop_back();
cout<<"x="<<punkt1.x<<", y="<<punkt1.y<<endl;
}
}
cout<<endl;
koniec=clock();
time=koniec-poczatek;
cout<<"\n"<<endl;
cout<<endl<<"Czas dzialania: "<<endl;
cout<<"otoczka (metoda lancuchow): "<<time<<endl;
return 0;
}