dziel i rządź” Sortowanie szybkie Jest to algorytm wynalezi
Transkrypt
dziel i rządź” Sortowanie szybkie Jest to algorytm wynalezi
Metody sortowania wykorzystujące procedury rekurencyjne typu ”dziel i rządź” Sortowanie szybkie Jest to algorytm wynaleziony w 1960 roku przez Hoare’a. Działa w miejscu. Niech n > 1. Dziel: Dzielimy tablicę A[l, . . . , r] na dwie podtablice A[l, . . . , m − 1] i A[m + 1 . . . , r] takie, że element A[m] jest już na właściwym miejscu tablicy A[ ]; ∀ j < i A[j] ¬ A[m]; ∀ j > i A[j] A[m]. Zwyciężaj: Sortujemy otrzymane podciągi wykorzystując rekrencyjnie szybkie sortowanie. Połącz: Ponieważ szybkie sortowanie jest sortowaniem w miejscu, operacja połącz jest niepotrzebna. 1 Zadanie 1 a) Przeanalizuj algorytm programu - szybkie sortowanie ze strażnikiem. Dane wejściowe: lista A[1...n], którą należy przesortować, N = Len([A]) oznacza liczbę elementów listy. Na końcu listy należy dodać strażnika (N + 1 element, który jest większy lub równy od wszystkich elementów listy – A[N ] = ∞. QuickSort(A[ ], 0, N − 1); Dane wyjściowe: przesortowana lista A[n]. Schemat blokowy procedury QuickSort: procedure QuickSort(A[ ], l : integer, r : integer) begin if r = l return ; m = Partition(A[ ], l, r); QuickSort(A[ ], l, m − 1); QuickSort(A[ ], m + 1, r); end Schemat blokowy procedury Partition: function Partition(A[ ], l : integer, r : integer) begin i := l, j := r + 1, v := A[l]; do do i := i + 1; while A[i] < v; do j := j − 1; while v < A[j]; if i < j A[i] ↔ A[j]; end if while j > i A[l] := A[j]; A[j] := v; return j end 2 b) Niech A oznacza napis SORTOWANIE, Len[A] = 10. A = [S, O, R, T, O, W, A, N, I, E, Z] – Z - strażnik QuickSort(0, 9) Partition(0, 9) i = 0, j = 10, v = S S O R T O W A N I E Z S O R E O W A N I T Z S O R E O I A N W T Z N O R E O I A S W T Z j=7 QuickSort(0, 6) Partition(0, 6) i = 0, j = 7, v = N N O R E O I A S N O R E O I A S N A R E O I O S N A I E O R O S E A I N O R O S j=3 QuickSort(0, 2) Partition(0, 2) i = 0, j = 3, v = E E A I N E A I N A E I N j=1 QuickSort(0, 0) QuickSort(2, 2) QuickSort(4, 6) Partition(4, 6) i = 4, j = 7, v = O O R O S O R O N O O R N O O R N j=5 QuickSort(4, 4) QuickSort(6, 6) QuickSort(8, 9) Partition(8, 9) i = 8, j = 10, v = W W T Z W T Z T W Z j=9 QuickSort(8, 8) QuickSort(10, 10) Jak wygląda drzewo ”dziel i rządź” dla tej tablicy? c) Jak wykazać poprawność tego algorytmu? d) Zaimplementuj ten algorytm w języku C dla tablicy znakowej. 3