_13th_Dragon napisał(a)
W zadaniu nie podano że wewnątrz ma być tablica dwuwymiarowa, grunt że na ekranie jest dwuwymiarowa.
Ylv napisał(a)
Na forum znalazłem jedynie coś takiego, co by pasowało do mojego pytania, ale nie działa w każdym wypadku...
Niestety się nie zgodzę, autor podał link do tematu (http://4programmers.net/Forum/Delphi_Pascal/110073-Sortowanie_tablicy_dwuwymiarowej?p=381631#id381631), w którym jasno napisane jest, że macierz ma być dwuwymiaowa; W licznych przykładach posługuje się właście taką tablicą, stąd musi być dwuwymiarowa; Autor zapewne podał przykład sposobu posortowania (tutaj: według wierszy), a nie jak to ma wyglądać na ekranie;
Mniejsza z tym, bardzo dobrym pomysłem było kopiowanie zawartości macierzy dwuwymiarowej do jednowymiarowej - można oszczędzić mnóstwo czasu na div i mod - sprawdziłem;
Twój przykład oczywiście działa, ale nie mam go jak porównać ze swoim, ponieważ użyłeś innego algorytmu sortującego; Potwierdziły się jednak moje przypuszczenia, że obliczając raz J div iCols, J mod iCols, (J + 1) div iCols oraz (J + 1) mod iCols i pakując wyniki do zmiennych można zaoszczędzić średnio od 5 - 15%, ale tylko przy macierzach o równej liczbie kolumn i wierszy - dla innych czas się znacznie wydłuża; Przetestowałem wszystkie rozwiązania (łącznie z tym @pelsta) i kopiowanie do jednowymiarowej macierzy jest wielokrotnie szybsze od sortowania macierzy źródłowej / docelowej;
Kod, którym testowałem znajduje się pod tym linkiem: http://4programmers.net/Pastebin/1777
Każdy z trzech algorytmów (mój z ciągłym dzieleniem, mój z pakowaniem wyników dzielenia do zmiennych oraz @pelsta z kopiowaniem tablicy do tymczasowej jednowymiarowej) sortuje macierz wykorzystując niezoptymalizowane sortowanie bąbelkowe; Każdy z nich sortuje tablicę raz na rozgrzewkę, następnie mierzony jest czas dla 10 sortowań z rzędu tej samej macierzy (przekazaną do procedury przez wartość), po czym pętla wraca, rozmiar macierzy jest powiększany i znów wykonuje się sortowanie; Tak więc każdy z algorytmów sortuje macierz 10 razy dla 10 rozmiarów + 1 raz na rozgrzewkę, czyli 110 razy; Przykładowe wyjście po wykonaniu programu:
Kopiuj
Non optimized bubble sort of square matrix:
Sort Pelsta [10x10]: 0
Sort FP [10x10]: 2
Sort FP Opt [10x10]: 1
----------------------------
Sort Pelsta [20x20]: 2
Sort FP [20x20]: 25
Sort FP Opt [20x20]: 23
----------------------------
Sort Pelsta [30x30]: 5
Sort FP [30x30]: 126
Sort FP Opt [30x30]: 115
----------------------------
Sort Pelsta [40x40]: 17
Sort FP [40x40]: 384
Sort FP Opt [40x40]: 352
----------------------------
Sort Pelsta [50x50]: 41
Sort FP [50x50]: 952
Sort FP Opt [50x50]: 918
----------------------------
Sort Pelsta [60x60]: 87
Sort FP [60x60]: 1981
Sort FP Opt [60x60]: 1888
----------------------------
Sort Pelsta [70x70]: 177
Sort FP [70x70]: 3947
Sort FP Opt [70x70]: 3512
----------------------------
Sort Pelsta [80x80]: 296
Sort FP [80x80]: 6546
Sort FP Opt [80x80]: 5904
----------------------------
Sort Pelsta [90x90]: 426
Sort FP [90x90]: 10083
Sort FP Opt [90x90]: 9274
----------------------------
Sort Pelsta [100x100]: 649
Sort FP [100x100]: 15412
Sort FP Opt [100x100]: 13809
----------------------------
Put ENTER key to exit...
Wyniki mówią same za siebie; Po raz kolejny udowodniłem sobie, że operatory mod i div są cholernie wolne i trzeba je omijać z daleka;
Wiadome, wybrałem najwolniejszy algorytm sortujący, jednak zrobiłem to celowo; Jest wiele szybszych, więc jest się nad czym zastanowić; Ty @_13th_Dragon wykorzystałeś QuickSort, który jest znacznie szybszy od wykorzystanego przeze mnie, ale nie o to mi chodziło; Miałem na myśli to, żebyś przedstawił najszybsze rozwiązanie posortowania macierzy dwuwymiarowej niezoptymalizowanym algorytmem sortowania bąbelkowego, a nie najszybsze jakie istnieje (i to jeszcze wykonane na macierzy jednowymiarowej);