Optymalizacja sortowania struktur

0
struct tablice
{
    long double tab,tab1;
     unsigned long int wynik;
};
...
tablice tablica[zestawy+1];
...
for(i=1;i<=zestawy;i++)
      for(j=1;j<zestawy;j++)
           if(tablica[j].wynik>tablica[j+1].wynik)
           {
              tablica[0]=tablica[j];
              tablica[j]=tablica[j+1];
              tablica[j+1]=tablica[0];
           } else 
              if(tablica[j].wynik==tablica[j+1].wynik) 
                  if(tablica[j].tab>tablica[j+1].tab)
                 { 
                     tablica[0]=tablica[j]; 
                     tablica[j]=tablica[j+1]; 
                     tablica[j+1]=tablica[0];
                 } 
....

Czy ktoś potrafi mi odpowiedzieć na trzy pytania:

  1. Dlaczego dla sortowania struktur w warunkach nie działa funkcja swap
    swap(tablica[j],tablica[j+1]); <--- to zamiast 3 linii w warunkach nie zadziała
  2. Jak posortować tą strukturę szybciej, Tzn. jak to wrzucić w quick sorta?
  3. W jaki sposób i dlaczego jest sens (o ile jest) zastąpić te tablice wektorami?
0
  1. Jeśli skopiowałeś, to błąd jest w nazwie tablicy będącej pierwszym argumentem
  2. Użyć std::sort z algorithm.h
  3. Jeśli znasz jej rozmiar to nie ma sensu. Jeśli nie znasz to vector zajmie sie alokacją pamięci.
0

Dzięki za satysfakcjonującą odpowiedź na 3 pytanie. Poprawiłem trochę mój post wkradły się małe błędy. Standardowej qsort nie mogę wykorzystać bo mam troszkę skomplikowane warunki odwołujące sie do dwóch rożnych pól tablicy struktur, których (chyba) qsort nie obsłuży. Dla jednej tablicy byłoby prosto napisać własnego qsorta dla tego algorytmu jednak nie potrafię go zastosować.

0

A to ma być C że chcesz qsort() używać? o_O
Przeładuj sobie operator<() w struktórze/klasie którą chcesz sortować po prostu a sort() (jest spora różnica między starym qsort() i nowym sort()) go będzie używał ;)

0

jest spora różnica między starym qsort() i nowym sort())

No to ładnie a ja cały czas qsortem leciałem.... zaraz poczytam co i jak z sort() i dzięki wielkie za pomoc

0

Różnica jest taka że qsort() korzysta ze wskaźnika do funkcji porównującej, przez co masz wywoływanie tej funkcji za kazdym razem. Nowy sort() jest pisany na szablonach i z użyciem funktorów które są inlinowane. Przez inlinowanie wszystkiego kod wykonuje się szybciej :)

0
Shalom napisał(a)

Przez inlinowanie wszystkiego kod wykonuje się szybciej :)
Nieprawda, inline może uczynić kod szybszym, ale równie dobrze wolniejszym. W tych sprawach i tak decyduje kompilator, a on zwykle wie lepiej. Oczywiście od qsort to bankowo będzie lepsze, jako że call wbity na sztywno jest szybszy niż indirect call (chociaż jeśli ten się nie zmienia /jak w qsort/ to różnica wielka nie jest).

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