Ordenación rápida usando subprocesos múltiples

QuickSort es una técnica de clasificación popular basada en el algoritmo divide y vencerás. En esta técnica, se elige un elemento como pivote y la array se divide a su alrededor. El objetivo de la partición es, dada una array y un elemento x de la array como pivote, colocar x en su posición correcta en una array ordenada y colocar todos los elementos más pequeños (menores que x) antes de x, y colocar todos los elementos mayores (mayores). que x) después de x.
Los subprocesos múltiples permiten la ejecución simultánea de dos o más partes de un programa para una utilización máxima de la CPU. Cada parte de dicho programa se llama hilo . Entonces, los hilos son procesos livianos dentro de un proceso.
Ejemplos: 
 

Entrada: arr[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1} 
Salida: 1 2 3 4 5 6 7 8 9 10
Entrada: arr[] = {54, 64, 95, 82, 12, 32, 63} 
Salida: 12 32 54 63 64 82 95 
 

Enfoque: La idea principal del enfoque es: 
 

  1. El hilo principal llama al método quicksort.
  2. El método divide la array y verifica la cantidad de subprocesos actuales.
  3. Se llama a nuevos subprocesos para el siguiente paso utilizando el mismo método paralelo.
  4. Utilice el método de clasificación rápida normal simple.

A continuación se muestra el programa que utiliza el grupo de subprocesos ForkJoinPool para mantener el mismo número de subprocesos que el número de CPU y reutilizar los subprocesos:
 

Java

// Java program for the above approach
import java.io.*;
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
 
public class QuickSortMutliThreading
    extends RecursiveTask<Integer> {
 
    int start, end;
    int[] arr;
 
    /**
     * Finding random pivoted and partition
     * array on a pivot.
     * There are many different
     * partitioning algorithms.
     * @param start
     * @param end
     * @param arr
     * @return
     */
    private int partition(int start, int end,
                        int[] arr)
    {
 
        int i = start, j = end;
 
        // Decide random pivot
        int pivoted = new Random()
                         .nextInt(j - i)
                     + i;
 
        // Swap the pivoted with end
        // element of array;
        int t = arr[j];
        arr[j] = arr[pivote];
        arr[pivote] = t;
        j--;
 
        // Start partitioning
        while (i <= j) {
 
            if (arr[i] <= arr[end]) {
                i++;
                continue;
            }
 
            if (arr[j] >= arr[end]) {
                j--;
                continue;
            }
 
            t = arr[j];
            arr[j] = arr[i];
            arr[i] = t;
            j--;
            i++;
        }
 
        // Swap pivoted to its
        // correct position
        t = arr[j + 1];
        arr[j + 1] = arr[end];
        arr[end] = t;
        return j + 1;
    }
 
    // Function to implement
    // QuickSort method
    public QuickSortMutliThreading(int start,
                                   int end,
                                   int[] arr)
    {
        this.arr = arr;
        this.start = start;
        this.end = end;
    }
 
    @Override
    protected Integer compute()
    {
        // Base case
        if (start >= end)
            return null;
 
        // Find partition
        int p = partition(start, end, arr);
 
        // Divide array
        QuickSortMutliThreading left
            = new QuickSortMutliThreading(start,
                                          p - 1,
                                          arr);
 
        QuickSortMutliThreading right
            = new QuickSortMutliThreading(p + 1,
                                          end,
                                          arr);
 
        // Left subproblem as separate thread
        left.fork();
        right.compute();
 
        // Wait untill left thread complete
        left.join();
 
        // We don't want anything as return
        return null;
    }
 
    // Driver Code
    public static void main(String args[])
    {
        int n = 7;
        int[] arr = { 54, 64, 95, 82, 12, 32, 63 };
 
        // Forkjoin ThreadPool to keep
        // thread creation as per resources
        ForkJoinPool pool
            = ForkJoinPool.commonPool();
 
        // Start the first thread in fork
        // join pool for range 0, n-1
        pool.invoke(
            new QuickSortMutliThreading(
                0, n - 1, arr));
 
        // Print shorted elements
        for (int i = 0; i < n; i++)
            System.out.print(arr[i] + " ");
    }
}
Producción: 

12 32 54 63 64 82 95

 

Complejidad de tiempo: O(N*log N)  
Espacio auxiliar: O(N)
 

Publicación traducida automáticamente

Artículo escrito por vickyrathod 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 *