QuickSort- Struktury

0

Muszę posortować tablicę struktur. Problem w tym, że sortowanie musi być napisane ręcznie... Do posortowania jest 10 różnych danych zawartych w strukturze. Chciałem to zrobic w taki sposób aby do funkcji sortującej wysyłać tylko jakiś wskaźnik (Wskaźnik na funkcję? ) na odpowiednią danę... żeby nie kopiować 10x kodu quickSorta. Może jakiś pomysł? Najlepiej prosty przykład?

Struktura

   struct losuj
       {
         AnsiString imie;
         AnsiString nazwisko;
         AnsiString helm;
         AnsiString suit;
         AnsiString boots;
         AnsiString gloves;
         AnsiString cena;
         AnsiString data;
         AnsiString faktura;
         AnsiString gwarancja;

       };
       losuj dane[1000000]; 

Jedna z funkcji porównujących

int compareByName (const TForm1::losuj &a, const TForm1::losuj &b)
 {
 if (a.imie < b.imie) return -1;
if (a.imie > b.imie) return 1;
if(a.imie == b.imie) return 0;
 } 
0

Jeśli chodzi o C++ to użyj std::sort

http://en.wikipedia.org/wiki/Function_object#In_C_and_C.2B.2B

0

Możesz użyć obiektu komparatora, a w operatorze () wstawić switcha, który wybierałby konkretną funkcję porównującą.

0
vpiotr napisał(a):

Jeśli chodzi o C++ to użyj std::sort

http://en.wikipedia.org/wiki/Function_object#In_C_and_C.2B.2B

Pisałem, że implementacja musi być pisana od 0 ... miałem użytą właśnie funkcje sort i nauczyciel powiedział, że sami mamy pisać (porażka...)

Wibowit, mógłbyś pokazac na przykładzie kodu ?

0
Pabloss napisał(a):
vpiotr napisał(a):

Jeśli chodzi o C++ to użyj std::sort

http://en.wikipedia.org/wiki/Function_object#In_C_and_C.2B.2B

To co Ci podałem pokazuje pośrednio jak zrobić raz sorta i wiele różnych strategii sortowania.

Przykład jak wywołać różne funkcje wewnątrz jednej funkcji:

template<typename Func>
void testFunc(const char *name, Func f)
{
    try {
        bool ok = f();
        cout << "Test [" << std::string(name) << "] " << (ok?"succeeded":"failed!") << "\n";
    }
    catch(exception &e) {
        cout << "Test [" << std::string(name) << "] failed!, error: " << e.what() << "\n";
    }
}

    bool TestConstruct1()
    {
        //...
    }

    bool TestConstruct2()
    {
        //...
    }

testFunc("Construct1", TestConstruct1);
testFunc("Construct2", TestConstruct2);
0

Takie coś mniej więcej rozumiem, ale to nie rozwiązuje mojego problemu. Przykładowo mam implementacje quicksorta
Jak do tego czegoś napisać właśnie ten wskaźnik na odpowiednią daną w strukturze?

void Quicksort (int  struktura, int left, int right, (jakiś wskaźnik?), funkcja porównująca?)
{
 ....
}
0

Nieco-pseudo (?) C++:

enum CompareType { CompareFirstName, CompareLastName };

class Comparator {
private:
  CompareType const comparisonType;
public:
  Comparator(CompareType comparisonType) : comparisonType(comparisonType) {}
  int compare(losuj &former, losuj &latter) {
    switch (comparisonType) {
      case CompareFirstName:
        return strcmp(former.imie, latter.imie);
      case CompareLastName:
        return strcmp(former.nazwisko, latter.nazwisko);
      default:
        throw error("impossibru");
    }
  }
}

void quickSort(losuj * tablica, int left, int right, Comparator &comparator); // definicja sortowania jako zadanie domowe :]

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