Categorías
Algorithms

Matriz de ordenación rápida en Java

Quicksort es un algoritmo de divide y vencerás. Primero divide una lista grande en dos sublistas más pequeñas y luego ordena recursivamente las dos sublistas. Si queremos ordenar una matriz sin ningún espacio adicional, la ordenación rápida es una buena opción. En promedio, la complejidad del tiempo es O (n log (n)).

El paso básico para ordenar una matriz es el siguiente:

  • Seleccione un pivote
  • Mueva elementos más pequeños a la izquierda y mueva elementos más grandes a la derecha del pivote
  • Ordenar recursivamente la parte izquierda y la parte derecha

Esta publicación muestra dos versiones de la implementación de Java. El primero elige el elemento más a la derecha como pivote y el segundo elige el elemento del medio como pivote.

Versión 1: elemento más a la derecha como pivote

La siguiente es la implementación de Java que usa el elemento más a la derecha como pivote.

public class QuickSort {
 
    public static void main(String[] args) {
        int[] arr = {4, 5, 1, 2, 3, 3};
        quickSort(arr, 0, arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
 
    public static void quickSort(int[] arr, int start, int end){
 
        int partition = partition(arr, start, end);
 
        if(partition-1>start) {
            quickSort(arr, start, partition - 1);
        }
        if(partition+1<end) {
            quickSort(arr, partition + 1, end);
        }
    }
 
    public static int partition(int[] arr, int start, int end){
        int pivot = arr[end];
 
        for(int i=start; i<end; i++){
            if(arr[i]<pivot){
                int temp= arr[start];
                arr[start]=arr[i];
                arr[i]=temp;
                start++;
            }
        }
 
        int temp = arr[start];
        arr[start] = pivot;
        arr[end] = temp;
 
        return start;
    }
}
  LeetCode: recuento de números más pequeños después de uno mismo (Java)

Puede usar el siguiente ejemplo para revisar el código.

Versión 2: elemento intermedio como pivote

public class QuickSort {
	public static void main(String[] args) {
		int[] x = { 9, 2, 4, 7, 3, 7, 10 };
		System.out.println(Arrays.toString(x));
 
		int low = 0;
		int high = x.length - 1;
 
		quickSort(x, low, high);
		System.out.println(Arrays.toString(x));
	}
 
	public static void quickSort(int[] arr, int low, int high) {
		if (arr == null || arr.length == 0)
			return;
 
		if (low >= high)
			return;
 
		// pick the pivot
		int middle = low + (high - low) / 2;
		int pivot = arr[middle];
 
		// make left < pivot and right > pivot
		int i = low, j = high;
		while (i <= j) {
			while (arr[i] < pivot) {
				i++;
			}
 
			while (arr[j] > pivot) {
				j--;
			}
 
			if (i <= j) {
				int temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
				i++;
				j--;
			}
		}
 
		// recursively sort two sub parts
		if (low < j)
			quickSort(arr, low, j);
 
		if (high > i)
			quickSort(arr, i, high);
	}
}
  LeetCode - Comparar números de versión (Java)

Producción:

9 2 4 7 3 7 10
2 3 4 7 7 9 10

Aquí es una muy buena animación de quicksort.

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

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