procedurę Quicksort(T[l..n]) if n jest małe then insert(T) else
wybierz element dzielący x
(* niech k równa się liczbie elementów tablicy T nie większych od x*) przestaw elementy tablicy T tak, że V,<fc T[i] < x Quicksort(T[l..fc]); Quicksort(T[(fc + l)..n]);
Analizie złożoności algorytmu Quicksort poświęcimy oddzielny wykład. Wówczas omówimy także sposoby implementacji kroku 1.
Problem:
Dane: liczby naturalne a i b
komentarz: liczby a i b są długie.
Wynik: iloczyn a ■ b
Dla prostoty opisu przyjmijmy, że obydwie liczby mają tę samą długość (równą n = 2k). Narzucający się algorytm oparty na strategii Dziel i Zwyciężaj polega na podziale n-bitowych czynników na części n/2-bitowe, a następnie odpowiednim wymnoźeniu tych części.
Niech a = a\ ■ 2S + ao i b = bi ■ 2S + bo, gdzie s = n/2; 0 < oi,ao,6i,6o < 2S. Iloczyn a ■ b możemy teraz zapisać jako
ab = C2 • 22s + ci • 2S + cq, gdzie C2 = ai&i; c\ = ao&i + aibo; co = ao&o-
Jak widać jedno mnożenie liczb n-bitowych można zredukować do czterech mnożeń liczb n/2-bitowych, dwóch mnożeń przez potęgę liczby 2 i trzech dodawań. Zarówno dodawania jak i mnożenia przez potęgę liczby 2 można wykonać w czasie liniowym. Taka redukcja nie prowadzi jednak do szybszego algorytmu - czas działania wyraża się wzorem T(n) = AT {n/2) + 0(n), którego rozwiązaniem jest T(ń) = 0(n2). Aby uzyskać szybszy algorytm musimy potrafić obliczać współczynniki C2,ci,cq przy użyciu trzech mnożeń liczb n/2-bitowych. Uzyskujemy to przez zastąpienie dwóch mnożeń podczas obliczania C\ jednym mnożeniem i dwoma odejmowaniami:
17