QuickSort- Struktury

Odpowiedz Nowy wątek
2014-12-12 14:16
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;
 } 
edytowany 4x, ostatnio: Pabloss, 2014-12-12 14:29

Pozostało 580 znaków

2014-12-12 14:38
0

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

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


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2014-12-12 15:35
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, 2014-12-12 15:35

Pozostało 580 znaków

2014-12-12 16:10
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, 2014-12-12 16:10
Czemu porażka? QuickSort uczy w prosty sposób paru fajnych rzeczy, warto choć raz napisać. - datdata 2014-12-12 16:22
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. - Pabloss 2014-12-12 16:34

Pozostało 580 znaków

2014-12-12 20:43
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);

Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2014-12-12 21:11
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?)
{
 ....
}

Pozostało 580 znaków

2014-12-12 21:21
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 :]

"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, 2014-12-12 21:22

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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