Schnellster Sortieralgorithmus Java

Shubham Vora 12 Oktober 2023
  1. Zählender Sortieralgorithmus in Java
  2. Zusammenführungssortieralgorithmus in Java
Schnellster Sortieralgorithmus Java

Dieser Artikel behandelt die zwei schnellsten Sortieralgorithmen und schreibt ihren Code in Java.

Die erste Technik ist das Zählende Sortieren, das einige Einschränkungen hat. Daher werden wir auch den Merge-Sort-Algorithmus behandeln.

Zählender Sortieralgorithmus in Java

Der zählende Sortieralgorithmus ist eine der schnellsten Sortiertechniken, die wir verwenden können, wenn Array-Elemente innerhalb eines bestimmten Bereichs angegeben werden. Es ist keine vergleichsbasierte Sortiertechnik, aber es sortiert das Array, indem es die Häufigkeit jedes Array-Elements zählt und speichert.

In einfachen Worten, es verwendet Hashing, um das Array zu sortieren.

Benutzer sollten den folgenden Algorithmus für die Zählsortierung befolgen.

  • Finden Sie die maximalen und minimalen Elemente des Arrays.
  • Als nächstes finden Sie den Bereich des Arrays, indem Sie die maximalen und minimalen Elemente verwenden, und erstellen Sie ein neues freq-Array mit Größenbereich, um die Frequenz jedes Elements zu speichern.
  • Durchlaufen Sie das ursprüngliche Array und speichern Sie die Frequenz jedes Elements im Array freq.
  • Zählen Sie die kumulativen Häufigkeiten für jedes Element, indem Sie die Häufigkeiten addieren.
  • Beginnen Sie am Ende mit der Iteration zum ursprünglichen Array und bringen Sie jedes Element mit dem Array freq an seine sortierte Position.
  • Speichern Sie alle sortierten Elemente von Ergebnis im ursprünglichen Array, um das ursprüngliche Array sortiert zu machen.

Beispielcode:

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] + " ");
    }
  }
}

Ausgang:

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

Zeitkomplexität des zählenden Sortieralgorithmus in Java

Die Zeitkomplexität für Counting Sort ist linear, da wir eine einzelne for-Schleife verwenden.

I’m besten fall O(n+k)
Durchschnittlicher Fall O(n+k)
Schlimmsten Fall O(n+k)

Raumkomplexität des zählenden Sortieralgorithmus in Java

Die Raumkomplexität für die zählende Sortierung ist O(n), da wir das temporäre Array verwenden, um sortierte Elemente zu speichern.

Einschränkungen des zählenden Sortieralgorithmus in Java

Die zählende Sortiertechnik ist ohne Zweifel der schnellste Algorithmus zum Sortieren von Elementen des Arrays, hat jedoch einige Einschränkungen.

Benutzer können sich ein Szenario vorstellen, in dem die Array-Länge sehr klein und der Eingabebereich zu groß ist, z. B. Millionen. Auch der Bubble Sort kann in solchen Fällen besser abschneiden.

Benutzer können es also verwenden, um das Array in linearer Zeit zu sortieren, wenn der Eingabebereich klein ist.

Zusammenführungssortieralgorithmus in Java

Um die Einschränkungen des Zählsortierens zu überwinden, können Benutzer die Merge-Sort-Technik verwenden.

Der Merge-Sort-Algorithmus folgt dem Divide-and-Conquer-Ansatz. Zuerst teilt es das Array in zwei Hälften, sortiert es und führt das sortierte Array zusammen.

Um den vollständigen Algorithmus Schritt für Schritt zu lernen, können Benutzer die folgenden Schritte ausführen.

  • Finden Sie den Mittelpunkt des Arrays.
  • Rufen Sie rekursiv die Funktion mergeSort() für den ersten und zweiten Teil des Arrays auf.
  • Rufen Sie die Funktion merge() auf, um das Array zusammenzuführen.
  • Erstellen Sie in der Funktion merge() zwei temporäre Arrays mit der gleichen Größe wie zwei Teile des Arrays und speichern Sie das Array-Element im entsprechenden temporären Array.
  • Iterieren Sie durch die temporären Arrays, bis beide unsortierte Elemente haben, finden Sie das kleinste Element aus beiden Arrays, speichern Sie es im ursprünglichen Array und bewegen Sie sich weiter.
  • Wenn ein Element im LeftArray verbleibt, speichern Sie es im ursprünglichen Array und machen Sie dasselbe für das RightArray.

Beispielcode:

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] + " ");
    }
  }
}

Ausgang:

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

Zeitkomplexität des Merge-Sort-Algorithmus in Java

Die Zeitkomplexität für mergeSort() ist O(nlogn), wobei n die Länge des Arrays ist. Hier ist die Zeitkomplexität der Funktion merge() O(n) und die Zeitkomplexität der Funktion mergeSort() ist O(logn), da wir für every einen rekursiven Aufruf machen halber Teil des Arrays.

I’m besten fall O(nlog(n))
Durchschnittlicher Fall O(nlog(n))
Schlimmsten Fall O(nlog(n))

Raumkomplexität des Merge-Sort-Algorithmus in Java

Die Raumkomplexität für die Zusammenführungssortierung beträgt O(n), da wir die beiden temporären Arrays verwenden, um unsortierte Elemente zu speichern.

In diesem Artikel haben wir Schritt für Schritt den Counting-Sort-Algorithmus, einen der schnellsten Algorithmen in Java, anhand seines Beispielcodes kennengelernt. Um die Einschränkungen der Zählsortierung zu überwinden, haben wir außerdem die Zusammenführungssortierung gelernt, die für jeden Eingabebereich funktioniert.

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

Verwandter Artikel - Java Sort