Algorytm równoległy - sortowanie
Sortowanie to proces porządkowania elementów w grupie w określonej kolejności, tj. W kolejności rosnącej, malejącej, alfabetycznej itp. Omówimy tutaj:
- Sortowanie według wyliczenia
- Sortowanie transpozycji nieparzyste-parzyste
- Sortowanie równoległe ze scalaniem
- Hyper Quick Sort
Sortowanie listy elementów jest bardzo powszechną operacją. Algorytm sortowania sekwencyjnego może nie być wystarczająco wydajny, gdy musimy sortować ogromną ilość danych. Dlatego do sortowania używane są algorytmy równoległe.
Sortowanie według wyliczenia
Sortowanie wyliczeniowe to metoda uporządkowania wszystkich elementów na liście poprzez znalezienie ostatecznej pozycji każdego elementu na posortowanej liście. Odbywa się to poprzez porównanie każdego elementu ze wszystkimi innymi elementami i znalezienie liczby elementów o mniejszej wartości.
Dlatego dla dowolnych dwóch elementów a i oraz a j musi być spełniony dowolny z poniższych przypadków -
- a i <a j
- a i > a j
- a i = a j
Algorytm
procedure ENUM_SORTING (n)
begin
for each process P1,j do
C[j] := 0;
for each process Pi, j do
if (A[i] < A[j]) or A[i] = A[j] and i < j) then
C[j] := 1;
else
C[j] := 0;
for each process P1, j do
A[C[j]] := A[j];
end ENUM_SORTING
Sortowanie transpozycji nieparzyste-parzyste
Sortowanie z transpozycją nieparzyste-parzyste jest oparte na technice sortowania bąbelkowego. Porównuje dwie sąsiednie liczby i zamienia je, jeśli pierwsza liczba jest większa niż druga, aby uzyskać listę rosnącą. Odwrotny przypadek dotyczy szeregu malejącego. Sortowanie transpozycji Odd-Even działa w dwóch fazach -odd phase i even phase. W obu fazach procesy wymieniają numery z sąsiednimi numerami po prawej stronie.
Algorytm
procedure ODD-EVEN_PAR (n)
begin
id := process's label
for i := 1 to n do
begin
if i is odd and id is odd then
compare-exchange_min(id + 1);
else
compare-exchange_max(id - 1);
if i is even and id is even then
compare-exchange_min(id + 1);
else
compare-exchange_max(id - 1);
end for
end ODD-EVEN_PAR
Sortowanie równoległe ze scalaniem
Sortowanie przez scalanie najpierw dzieli nieposortowaną listę na najmniejsze możliwe listy podrzędne, porównuje ją z listą sąsiednią i scala w kolejności posortowanej. Bardzo ładnie implementuje równoległość, postępując zgodnie z algorytmem dziel i zwyciężaj.
Algorytm
procedureparallelmergesort(id, n, data, newdata)
begin
data = sequentialmergesort(data)
for dim = 1 to n
data = parallelmerge(id, dim, data)
endfor
newdata = data
end
Hyper Quick Sort
Sortowanie hiperszybkie to implementacja sortowania szybkiego na hipersześcianie. Jego kroki są następujące -
- Podziel nieposortowaną listę między każdy węzeł.
- Sortuj każdy węzeł lokalnie.
- Z węzła 0 rozgłaszaj medianę.
- Podziel każdą listę lokalnie, a następnie zamień połówki w najwyższym wymiarze.
- Powtarzaj kroki 3 i 4 równolegle, aż wymiar osiągnie 0.
Algorytm
procedure HYPERQUICKSORT (B, n)
begin
id := process’s label;
for i := 1 to d do
begin
x := pivot;
partition B into B1 and B2 such that B1 ≤ x < B2;
if ith bit is 0 then
begin
send B2 to the process along the ith communication link;
C := subsequence received along the ith communication link;
B := B1 U C;
endif
else
send B1 to the process along the ith communication link;
C := subsequence received along the ith communication link;
B := B2 U C;
end else
end for
sort B using sequential quicksort;
end HYPERQUICKSORT