Processing math: 14%

Ćwiczenia 2: sortowanie, część I

Zadanie 1 (Algorytm Shella)

  1. Udowodnij, że jeżeli dwuwymiarową tablicę liczbową, posortowaną niemalejąco kolumnami, posortujemy wierszami, to nadal będzie ona posortowana kolumnami.
  2. Niech A[1..n] będzie tablicą liczb całkowitych i niech h będzie dodatnią liczbą całkowitą. Powiem, że A jest h-posortowana, jeżeli dla każdego i=1,,nh, A[i]A[i+h]. Algorytm h-sortowania nazywamy każdy algorytm, który sortuje niemalejąco i niezależnie wszystkie podtablice A[i],A[i+h],A[i+2h],, dla i=1,2,,min. Udowodnij, że jeżeli h_2-posortujemy h_1-posortowaną tablicę A , to będzie ona nadal h_1-posortowana.
  3. Niech k będzie dodatnią liczbą całkowitą i niech h_1, h_2, \ldots, h_k będzie malejącym ciągiem dodatnich liczb całkowitych, w którym h_k = 1. Rozważmy następujący algorytm sortowania:

    for i := 1 to k do
    \mbox{ } wykonaj h_i -sortowanie algorytmem sortowania przez wstawianie, niezależnie na każdym podciągu;

    Udowodnij, że powyższy algorytm sortuje.

  4. Załóżmy, że tablica A jest jednocześnie 2- i 3-posortowana. Ile wynosi maksymalna liczba inwersji w takiej tablicy?
  5. Zanalizuj złożoność algorytmu Shella przy założeniu, że ciąg h_1, h_2, \ldots, h_k składa się ze wszystkich liczb postaci 2^p3^q i mniejszych od n , gdzie p i q są nieujemnymi liczbami całkowitymi.

Zadanie 2 (Przesunięcie cykliczne w miejscu)

Dana jest n-elementowa tablica A[1..n] oraz liczba całkowita k \in [1..n] . Zaproponuj liniowy algorytmy przesunięcia cyklicznego elementów tablic A o k pozycji w lewo.

Przykład: ciąg [1,2,3,4,5] przesunięty cyklicznie o 2 w lewo ma postać [3,4,5,1,2] .

Zadanie 3 (Proste scalanie w miejscu)

Dane są dodatnie liczby całkowite k, n , k \le n, oraz tablica liczb całkowitych A[1..n] taka, że podtablice a[1..k] i a[k+1..n] są uporządkowane nie malejąco. Przy założeniu, że k = O(\sqrt n) zaproponuj algorytm sortowania tablicy (scalania dwóch ciągów uporządkowanych) A w miejscu i w czasie O(n).

Zadanie 4 (Sortowanie blokowe)

Niech \displaystyle A[1..n] będzie tablicą liczb całkowitych. Przyjmijmy, że \displaystyle n = r^2 dla pewnego naturalnego r . Zawartość tablic A traktujemy jako zapis r rekordów (bloków). Każdy rekord-blok zajmuje spójny fragment tablicy od pozycji (i-1)r+1 do pozycji ir , dla pewnego i \in [1..r] . Kluczem w rekordzie jest ostatni element bloku. Zaproponuj sortowanie rekordów względem ich kluczy. Twój algorytm powinien działać w miejscu i w czasie liniowym. Kolejność elementów w rekordzie nie może ulec zmianie.

Zadanie 5 (Scalanie w miejscu)

Dane są dodatnie liczby całkowite k \le n oraz tablica liczb całkowitych A[1..n] taka, że podtablice A[1..k] i A[k+1..n] są uporządkowane nie malejąco. Zaproponuj algorytm sortowania tablicy (scalania dwóch ciągów uporządkowanych) A w miejscu i w czasie O(n).

Zadanie 6 (Sortowanie w miejscu i stabilnie)

Zaproponuj algorytm, który sortuje n-elementowe ciągi zer i jedynek w czasie O(n\log n), w miejscu i stabilnie.

Zadanie 7 (Sortowanie optymalne 5 elementów)

Zaproponuj algorytm sortujący za pomocą minimalnej liczby porównań ciągi 5-elementowe.