Wskazówka:
Niewielki rozmiar analizowanych danych pozwala na prześledzenie działania algorytmu i ustalenie końcowej zawartości tablicy A bez pełnego zrozumienia istoty działania algorytmu. Istotne jest tutaj, że w kolejnych obrotach pętli „dopóki s < n wykonuj” porównujemy ze sobą (i ewentualnie zamieniamy) elementy tablicy A w odległościach 1, 2, 4 itd. Śledząc działanie programu, uzyskamy następujące rozwiązanie:

k

Początkowa zawartość tablicy A[1...2k]

Końcowa zawartość tablicy A[1...2k]

2

[4, 3, 1, 2]

[1, 4, 3, 2]

2

[2, 3, 4, 1]

[1, 3, 2, 4]

3

[1, 2, 3, 4, 5, 6, 7, 8]

[.1, .2, 3, 4, 5, 6, 7, .8.1

3

[8, 7, 6, 5, 4, 3, 2, 1]

[.1, .8, 7, 6, 5, .4, 3, 2]

3

[4, 5, 6, 1, 8, 3, 2, 4]

[.1, .5, .4, .6, 2, 8, 3, 4]


Postarajmy się jednak zrobić trochę więcej: ustalić ideę podanego algorytmu; wiedzę tę wykorzystamy również przy rozwiązywaniu zadań 2 i 3.

Najpierw zauważmy, że po zakończeniu pętli „dla = 1,2,…,k wykonuj” zmienna n ma wartość 2k.

W pierwszym obrocie pętli „dopóki s < n wykonuj” porównujemy A[1] z A[2], A[3] z A[4] itd. Przy porównaniu A[i] z A[i+1] wykonujemy zamianę, gdy A[i]>A[i+1]. A zatem po pierwszym obrocie pętli w A[1] znajduje się minimum z A[1] i A[2], w A[3] znajduje się minimum z A[3] i A[4], w A[5] znajduje się minimum z A[5] i A[6] itd. Po każdym obrocie pętli „dopóki s < n wykonuj” wartość s zwiększa się dwukrotnie. Tak więc przy drugim obrocie tej pętli wartość s będzie równa 2. Wówczas porównamy A[1] z A[3] i, w przypadku gdy A[1] >A[3], dokonana zostanie zamiana tych elementów. W efekcie w A[1] znajdzie się minimum z czterech pierwszych elementów tablicy A. Następnie porównamy A[5] z A[7], skutkiem czego w A[5] znajdzie się minimum z A[5], A[6], A[7], A[8], a więc minimum z kolejnych czterech elementów tablicy A. Przeprowadzając analizę tak dalej, dochodzimy do wniosku, że takie lokalne minima z grup kolejnych czwórek elementów tablicy A znajdą się w pierwszych elementach tych czwórek.

Co się stanie w kolejnych obrotach pętli „dopóki s < n wykonuj”? Łatwo sprawdzić, że wielkość grup będzie podwajana. Tak więc będziemy mieć do czynienia z grupami kolejnych 8 elementów, następnie — grupami kolejnych 16 elementów itd…. Minima z tych grup będą zapamiętywane w pierwszych elementach grup. Zatem po kolejnych obrotach pętli w A[1] będą zapamiętane kolejno minima z pierwszych 2i elementów tablicy A. W szczególności po k-tym obrocie, a więc na zakończenie algorytmu, w A[1] znajdzie się minimum ze wszystkich elementów tablicy A.
Powrót do pytań