Algoritmo de clasificación más rápido Java

Shubham Vora 12 octubre 2023
  1. Algoritmo de clasificación de conteo en Java
  2. Combinar algoritmo de clasificación en Java
Algoritmo de clasificación más rápido Java

Este artículo cubrirá los dos algoritmos de clasificación más rápidos y escribirá su código en Java.

La primera técnica es la clasificación por conteo, que tiene algunas limitaciones. Por lo tanto, también cubriremos el algoritmo Merge Sort.

Algoritmo de clasificación de conteo en Java

El algoritmo de clasificación por conteo es una de las técnicas de clasificación más rápidas que podemos usar cuando los elementos de la matriz se dan dentro de un rango específico. No es una técnica de clasificación basada en la comparación, pero clasifica la matriz contando y almacenando la frecuencia de cada elemento de la matriz.

En términos simples, utiliza hashing para ordenar la matriz.

Los usuarios deben seguir el siguiente algoritmo para el tipo de conteo.

  • Encuentre los elementos máximo y mínimo de la matriz.
  • A continuación, encuentre el rango de la matriz usando elementos máximos y mínimos y cree una nueva matriz de “frecuencia” de rango de tamaño para almacenar la frecuencia de cada elemento.
  • Iterar a través de la matriz original y almacenar la frecuencia de cada elemento en la matriz freq.
  • Al sumar las frecuencias, cuente las frecuencias acumuladas de cada elemento.
  • Comience a iterar a la matriz original desde el final y coloque cada elemento en su posición ordenada utilizando la matriz freq.
  • Almacene todos los elementos ordenados desde resultado en la matriz original para ordenar la matriz original.

Código de ejemplo:

class CountingSort {
  // function to find the maximum from the array
  static int findMax(int arr[]) {
    int maxi = arr[0];
    for (int i = 1; i < arr.length; i++) {
      if (arr[i] > maxi)
        maxi = arr[i];
    }
    return maxi; // return maximum
  }
  //  function to find the minimum from the array
  static int findMin(int arr[]) {
    int mini = arr[0];
    for (int i = 1; i < arr.length; i++) {
      if (arr[i] < mini)
        mini = arr[i];
    }
    return mini; // return minimum
  }
  static void cntSort(int[] arr) {
    int maxi = findMax(arr);
    int mini = findMin(arr);
    //     getting range from maximum and minimum elements of the array
    int range = maxi - mini + 1;
    //     creating the array to store the frequency of elements
    int freq[] = new int[range];
    //     resultant array
    int result[] = new int[arr.length];
    //     counting frequency of elements and storing it to freq array
    for (int i = 0; i < arr.length; i++) {
      freq[arr[i] - mini]++;
    }
    // Doing addition of frequency
    for (int i = 1; i < freq.length; i++) {
      freq[i] += freq[i - 1];
    }
    // Putting every element of arr to its correct place based on the freq array
    for (int i = arr.length - 1; i >= 0; i--) {
      result[freq[arr[i] - mini] - 1] = arr[i];
      freq[arr[i] - mini]--;
    }
    // Make arr array sorted by assigning elements from the result array
    for (int i = 0; i < arr.length; i++) {
      arr[i] = result[i];
    }
  }

  public static void main(String[] args) {
    int[] arr = {10, 20, -2, -4, 3, 40, 50, 30, 20, 10};
    cntSort(arr);
    System.out.println("Sorted Array using counting sort is ");
    for (int a = 0; a < arr.length; a++) {
      System.out.print(arr[a] + " ");
    }
  }
}

Producción :

Sorted Array is -4 -2 3 10 10 20 20 30 40 50

Complejidad temporal del algoritmo de clasificación de conteo en Java

La complejidad de tiempo para Counting Sort es de orden lineal ya que estamos usando un solo bucle for.

Mejor caso O(n+k)
Caso promedio O(n+k)
Peor de los casos O(n+k)

Complejidad espacial del algoritmo de clasificación de conteo en Java

La complejidad del espacio para la ordenación de conteo es O(n) ya que usamos la matriz temporal para almacenar elementos ordenados.

Limitaciones del algoritmo de clasificación de conteo en Java

La técnica de clasificación por conteo es el algoritmo más rápido para clasificar elementos de la matriz sin duda, pero tiene algunas limitaciones.

Los usuarios pueden pensar en el escenario donde la longitud de la matriz es muy pequeña y el rango de entrada es demasiado grande, como millones. Incluso Bubble Sort puede funcionar mejor en tales casos.

Por lo tanto, los usuarios pueden usarlo para ordenar la matriz en tiempo lineal cuando el rango de entrada es pequeño.

Combinar algoritmo de clasificación en Java

Para superar las limitaciones de Counting Sort, los usuarios pueden utilizar la técnica Merge Sort.

El algoritmo Merge Sort sigue el enfoque divide y vencerás. Primero, divide la matriz en dos mitades, la ordena y fusiona la matriz ordenada.

Para aprender el algoritmo completo paso a paso, los usuarios pueden seguir los pasos a continuación.

  • Encuentre el punto medio de la matriz.
  • Llame recursivamente a la función mergeSort() para la primera y segunda parte de la matriz.
  • Llame a la función merge() para fusionar la matriz.
  • En la función merge(), cree dos arreglos temporales del mismo tamaño que dos partes del arreglo y almacene el elemento del arreglo en el arreglo temporal correspondiente.
  • Repita los arreglos temporales hasta que ambos tengan elementos sin clasificar, encuentre el elemento mínimo de ambos arreglos, guárdelo en el arreglo original y siga moviéndose.
  • Si queda algún elemento en el LeftArray, guárdelo en el array original y haga lo mismo con el RightArray.

Código de ejemplo:

class Test {
  // function to merge two sorted arrays
  static void merge(int arr[], int left, int mid, int right) {
    // sizes for temp arrays
    int n1 = mid - left + 1;
    int n2 = right - mid;
    // temp arrays
    int LeftArray[] = new int[n1];
    int RigthArray[] = new int[n2];
    // clone data to temp arrays
    for (int i = 0; i < n1; ++i) LeftArray[i] = arr[left + i];
    for (int j = 0; j < n2; ++j) RigthArray[j] = arr[mid + 1 + j];
    int a = 0, b = 0;
    // merging temp arrays to the original array
    int k = left;
    while (a < n1 && b < n2) {
      if (LeftArray[a] <= RigthArray[b]) {
        arr[k] = LeftArray[a];
        a++;
      } else {
        arr[k] = RigthArray[b];
        b++;
      }
      k++;
    }
    // If any elements are left in LeftArray, clone it to the original array
    while (a < n1) {
      arr[k] = LeftArray[a];
      a++;
      k++;
    }
    // If any elements are left in RightArray, clone it to the original array
    while (b < n2) {
      arr[k] = RigthArray[b];
      b++;
      k++;
    }
  }
  static void mergeSort(int arr[], int left, int right) {
    if (left < right) {
      // Find the mid of the array using the left and right
      int mid = left + (right - left) / 2;
      // sort the first half of the array
      mergeSort(arr, left, mid);
      // sort the second half of the array
      mergeSort(arr, mid + 1, right);
      // sort both parts of the array and merge it
      merge(arr, left, mid, right);
    }
  }
  public static void main(String args[]) {
    int[] arr = {10, 201, -22121, -412, 3, 212121, 50, 30, 20, 1021212};
    mergeSort(arr, 0, arr.length - 1);
    System.out.println("Sorted array using merge sort is");
    for (int a = 0; a < arr.length; a++) {
      System.out.print(arr[a] + " ");
    }
  }
}

Producción :

Sorted array is -22121 -412 3 10 20 30 50 201 212121 1021212

Complejidad temporal del algoritmo Merge Sort en Java

La complejidad de tiempo para mergeSort() es O(nlogn), donde n es la longitud de la matriz. Aquí, la complejidad de tiempo de la función merge() es de O(n), y la complejidad de tiempo de la función mergeSort() es O(logn) ya que estamos haciendo una llamada recursiva para cada la mitad de la matriz.

Mejor caso O(nlog(n))
Caso promedio O(nlog(n))
Peor de los casos O(nlog(n))

Complejidad espacial del algoritmo Merge Sort en Java

La complejidad del espacio para la ordenación por fusión es de O(n) ya que usamos las dos matrices temporales para almacenar elementos no ordenados.

En este artículo, hemos aprendido paso a paso el algoritmo de clasificación por conteo, uno de los algoritmos más rápidos en Java, con su código de ejemplo. Además, para superar las limitaciones de la ordenación por conteo, hemos aprendido la ordenación por fusión, que funcionará para cualquier rango de entrada.

Shubham Vora avatar Shubham Vora avatar

Shubham is a software developer interested in learning and writing about various technologies. He loves to help people by sharing vast knowledge about modern technologies via different platforms such as the DelftStack.com website.

LinkedIn GitHub

Artículo relacionado - Java Sort