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