QuickSort- Struktury

QuickSort- Struktury
PA
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:339
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

Kopiuj
   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

Kopiuj
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;
 } 
edytowany 4x, ostatnio: Pabloss
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 4 godziny
0

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


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
PA
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:339
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 ?

edytowany 1x, ostatnio: Pabloss
datdata
Czemu porażka? QuickSort uczy w prosty sposób paru fajnych rzeczy, warto choć raz napisać.
PA
Pisałem wiele razy Quicksorta dla zwykłych tablic... nie rozumiem tylko po co pisać go przy bazie danych gdzie jest na prawdę wiele innych rzeczy do zrobienia. Marnotrastwo czasu w tym wypadku.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
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:

Kopiuj
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);
PA
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:339
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?

Kopiuj
void Quicksort (int  struktura, int left, int right, (jakiś wskaźnik?), funkcja porównująca?)
{
 ....
}
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 4 godziny
0

Nieco-pseudo (?) C++:

Kopiuj
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 :]

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.