Clasificación de transposición par impar/clasificación de bloques usando pthreads

La ordenación por transposición par-impar es un algoritmo de ordenación en paralelo . Se basa en la técnica Bubble Sort , que compara cada 2 números consecutivos en la array y los intercambia si el primero es mayor que el segundo para obtener una array de orden ascendente. Consta de 2 fases: la fase impar y la fase par:

  • Fase impar: cada elemento indexado impar se compara con el siguiente elemento indexado par (considerando la indexación basada en 1).
  • Fase par: cada elemento indexado par se compara con el siguiente elemento indexado impar.

Este artículo utiliza el concepto de subprocesos múltiples , específicamente pthread . En cada iteración, cada par de 2 elementos consecutivos se compara mediante subprocesos individuales que se ejecutan en paralelo, como se ilustra a continuación.

Ejemplos:

Input: { 2, 1, 4, 9, 5, 3, 6, 10 }
Output: 1, 2, 3, 4, 5, 6, 9, 10

Input: { 11, 19, 4, 20, 1, 22, 25, 8}
Output: 1, 4, 8, 11, 19, 20, 22, 25

Nota: Compile el programa usando el siguiente comando en su sistema basado en Linux.

g++ program_name.cpp -pthread

A continuación se muestra la implementación del tema anterior:

CPP

// CPP Program for Odd-Even Transposition sort
// using pthreads
  
#include <bits/stdc++.h>
#include <pthread.h>
  
using namespace std;
  
// size of array
#define n 8
  
// maximum number of threads
int max_threads = (n + 1) / 2;
  
int a[] = { 2, 1, 4, 9, 5, 3, 6, 10 };
int tmp;
  
// Function to compare and exchange
// the consecutive elements of the array
void* compare(void* arg)
{
  
    // Each thread compares
    // two consecutive elements of the array
    int index = tmp;
    tmp = tmp + 2;
  
    if ((a[index] > a[index + 1]) && (index + 1 < n)) {
        swap(a[index], a[index + 1]);
    }
}
  
void oddEven(pthread_t threads[])
{
    int i, j;
  
    for (i = 1; i <= n; i++) {
        // Odd step
        if (i % 2 == 1) {
            tmp = 0;
  
            // Creating threads
            for (j = 0; j < max_threads; j++)
                pthread_create(&threads[j], NULL, compare, NULL);
  
            // joining threads i.e. waiting
            // for all the threads to complete
            for (j = 0; j < max_threads; j++)
                pthread_join(threads[j], NULL);
        }
  
        // Even step
        else {
            tmp = 1;
  
            // Creating threads
            for (j = 0; j < max_threads - 1; j++)
                pthread_create(&threads[j], NULL, compare, NULL);
  
            // joining threads i.e. waiting
            // for all the threads to complete
            for (j = 0; j < max_threads - 1; j++)
                pthread_join(threads[j], NULL);
        }
    }
}
  
// Function to print an array
void printArray()
{
    int i;
    for (i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
}
  
// Driver Code
int main()
{
  
    pthread_t threads[max_threads];
  
    cout << "Given array is: ";
    printArray();
  
    oddEven(threads);
  
    cout << "\nSorted array is: ";
    printArray();
  
    return 0;
}

Producción:

Given array is:  2 1 4 9 5 3 6 10
Sorted array is: 1 2 3 4 5 6 9 10

Complejidad del tiempo : la complejidad del tiempo se reduce a O(N) debido al cálculo paralelo mediante subprocesos.
Complejidad del trabajo : la complejidad del trabajo de este programa es O (N) ya que se utilizan N/2 número de subprocesos (recursos) para ordenar la array. Entonces, la complejidad del tiempo de trabajo del programa es O (N ^ 2).

Publicación traducida automáticamente

Artículo escrito por shivam_garg y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *