Strona 1 z 1

Sortowanie tablicy bąbelkowo w której pierwszym elementem tablicy jest string, a drugim liczba

: 03 lip 2014, 13:11
autor: tomi0001
Mam taki problem chcę posortować tablicę algorytmem sortowanie bąbelkowego jak to zrobić po jak próbowałem zrobić w taki sposób

Kod: Zaznacz cały

 $n = count($szukaj2);
      for($j= 0;$j < $n;$j++) {
        for ($x = $j - 1;$x >=$j;$x--) {
          if ($szukaj2[$x-1] < $szukaj2[$x]) {
        list($szukaj2[$x-1],$szukaj2[$x]) = array($szukaj2[$x],$szukaj2[$x-1]);
          }
        }
 
      }
Przy czym $szukaj2 jest tablicą dwuwymiarową pierwszy element tablicy jest liczba zmiennoprzecinkowa, a drugi to string, moje pytanie jest takie gdzie tu błąd.

Re: Sortowanie tablicy bąbelkowo w której pierwszym elementem tablicy jest string, a drugim liczba

: 03 lip 2014, 20:55
autor: kobylecki
A trzecim elementem co jest?

Trochę nie napisałeś o co ci chodzi. Algorytm sortowania, w tym wypadku bąbelkowy, powinien sortować tablicę elementów jakiegoś jednego konkretnego typu. Na przykład tablicę liczb, tablicę stringów, itd. Gdyby tak nie było trudno by było powiedzieć co to znaczy, że jakiś string jest mniejszy czy większy od liczby.

Same indeksy j i x też masz źle ustawiane. Np. w pierwszej iteracji j = 0 i x = -1 i chcesz się odwołać do elementów -1 i -2.
Napisz o co tak naprawdę chodzi, może elementy w tablicy to pary string i liczba? (np. zawarte w tablicy)

-- 03 lip 2014 19:24 --

Idąc dalej, przyjmę, że elementem twojej tablicy jest tablica z dwoma elementami (pierwszy string, a drugi liczba).
W takim wypadku

Kod: Zaznacz cały

if ($szukaj2[$x-1] < $szukaj2[$x])
nie może się poprawnie wykonać, bo nie wiadomo co to znaczy tablica < tablica.
Moja propozycja jest taka, żebyś w tym warunku sprawdził, czy elementy nie są w tej relacji (mniejszości), ale w odrębnej funkcji.

Kod: Zaznacz cały

if (compare($szukaj2[$x-1], $szukaj2[$x]) < 0)
, a wcześniej zdefiniuj funkcję compare, do której przekazujesz dwa elementy, które są dwuelementowymi tablicami string, liczba. Zazwyczaj taka funkcja powinna zwracać 0 kiedy elementy są równe, ujemną wartość jeżeli pierwsza jest mniejsza, dodatnią - jeżeli jest większa. I tak to zrób.

Na koniec przejrzyj indeksy, czy rzeczywiście są dobrze ustawiane w pętlach for.

tutaj przykładowa implementacja takiej funkcji:

Kod: Zaznacz cały

function compare($elem1, $elem2)
{
    // porównujemy stringi i jeżeli były różne to znamy wynik
    $string_comparison = strcmp($elem1[0], $elem2[0]);
    if ($string_comparison != 0) return $string_comparison;
    
    // jeżeli były równe to musimy porównać liczby
    return $elem2[1] - $elem1[1];
}