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_SORTINGSortowanie 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_PARSortowanie 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
endHyper 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