Implementare il merge sort in Java

Mattepuffo's logo
Implementare il merge sort in Java

Implementare il merge sort in Java

Da Wikipedia:

Il merge sort è un algoritmo di ordinamento basato su confronti che utilizza un processo di risoluzione ricorsivo, sfruttando la tecnica del Divide et Impera, che consiste nella suddivisione del problema in sottoproblemi della stessa natura di dimensione via via più piccola. Fu inventato da John von Neumann nel 1945. Una descrizione dettagliata e un'analisi della versione bottom-up dell'algoritmo apparve in un articolo di Goldstine e Neumann già nel 1948.

Ovviamente possiamo implementarlo in tutti i linguaggi che vogliamo.

Qui sotto un esempio in Java:

public class Main {

    public static void main(String[] args) {
        int[] arr = {13, 78, 99, 500, 1, 3};

        System.out.println("ARRAY ORIGINALE:");
        printArray(arr);

        sort(arr, 0, arr.length - 1);

        System.out.println("ARRAY ORDINATO:");
        printArray(arr);
    }

    static void merge(int[] arr, int l, int m, int r) {
        int n1 = m - l + 1;
        int n2 = r - m;

        int[] left = new int[n1];
        int[] right = new int[n2];

        for (int i = 0; i < n1; ++i) {
            left[i] = arr[l + i];
        }

        for (int j = 0; j < n2; ++j) {
            right[j] = arr[m + 1 + j];
        }

        int i = 0;
        int j = 0;

        int k = l;
        while (i < n1 && j < n2) {
            if (left[i] <= right[j]) {
                arr[k] = left[i];
                i++;
            } else {
                arr[k] = right[j];
                j++;
            }
            k++;
        }

        while (i < n1) {
            arr[k] = left[i];
            i++;
            k++;
        }

        while (j < n2) {
            arr[k] = right[j];
            j++;
            k++;
        }
    }

    static void sort(int[] arr, int l, int r) {
        if (l < r) {
            int m = l + (r - l) / 2;
            sort(arr, l, m);
            sort(arr, m + 1, r);
            merge(arr, l, m, r);
        }
    }

    static void printArray(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; ++i) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

}

Enjoy!


Condividi

Commentami!