Wektor obiektow - sortowanie

0

Czesc, mam pytanie: sortujac np. wektor obiektow mozemy skorzystac z std::sort + przeciazajac operator(). A w jakis sposob mozna zaimplementowac wlasna metode sortowania - np quick sort dla takiego wektora ?

Dajmy na to jakis moj stary program (to tylko przyklad wiem ze zle napisany).

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
const unsigned numberOfPeople = 3;
using namespace std;

struct Person {
    string name;
    int age;
    string favoriteColor;
};

struct Compare_functor {
    bool operator()(const Person &first, const Person & second){
        return first.age < second.age;
    }
}myobject;

int main()
{
    vector<Person> people(numberOfPeople);
    for (vector<Person>::size_type i = 0; i != numberOfPeople; ++i) {
        cout << "Person #" << i + 1 << " name: ";
        cin >> people[i].name;
        cout << "Person #" << i + 1 << " age: ";
        cin >> people[i].age;
        cout << "Person #" << i + 1 << " favorite color: ";
        cin >> people[i].favoriteColor;
    }
    cout << "\n\n";
    sort(people.begin(), people.end(), myobject);
        for (unsigned i = 0; i < people.size(); ++i)
            cout << people[i].age << " ";
    cout << endl;
    return 0;
} 

Dla napisania wlasnego quick sort musialbym skorzystac np z:

void quickSort(vector<int> &input, int left, int right)  
{  
   int i=left, j=right;  
   int pivot = input[(i+j)/2];  
  
   // partition  
   while (i <= j) {  
       while (input[i] < pivot)  
           i++;  
  
       while (input[j] > pivot)  
           j--;  
  
       if (i <= j) {  
           int tmp = input[i];  
           input[i] = input[j];  
           input[j] = tmp;  
  
           i++;  
           j--;  
       }  
   }  
  
   // recursion  
   if (left < j)  
       quickSort(input, left, j);  
  
   if (i < right)  
       quickSort(input, i, right);  
}   

I przedefiniowac wszystkie potrzebne operatory dla mojej klasy ?

Moze glupie pytanie ale dawno nie uzywalem c++ a musze rozwiazac takie problem.

0

Obejrzyj jak jest zbudowany sort w STL'u.

0

Wyglada dosc skomplikowanie... a chcac napisac wlasne sortowanie dla obiektow z wektora ze wzgledu na jakies pole, ze złożonością n*log n, tak jak pisałem wcześniej należy przeciążać operatory występujące w danym sortowaniu ?

1

std::sort korzysta z intro sort czyli quick sort, który jak stwierdzi, że mu za długo sortowanie idzie (quick sort ma w najgorszym wypadku złożoność O(n^2), ale z reguły jest szybszy niż heapsort) to na heapsorta przechodzi (zawsze złożoność O(n log n))

1

Nie musisz przeciążać operatorów. Zastąp wszystkie operatory w tej funkcji sortującej tym jednym komparatorem który masz i tyle. Przecież jak komparator wykonuje ci < to odwracając kolejność argumentów masz > ;]

1
int compare(int a,int b) { return a<b; }

void quickSort(vector<int> &input, int left, int right,bool (*cmp)(int,int))
  {
   if(!cmp(input[left],input[left+1])) cout<<"Trzeba wymienić miejscami"<<endl;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1