Java中的合併排序演算法

jdon發表於2019-02-28

合併排序演算法是一種分而治之的演算法。在分而治之的正規化中,一個問題被分解成較小的問題,其中每個小問題仍然保留著大問題的所有屬性——大小除外。為了解決原始問題,每個部分都是單獨解決的,然後這些部分又合併在一起。例如,假設您必須使用氣泡排序演算法對200個元素的陣列進行排序。因為選擇排序需要O(n^2)時間,所以對陣列進行排序大約需要40000個時間單位。現在想象一下,將陣列拆分成十個相等的片段,並使用選擇排序對每個片段進行單獨排序。現在,每件物品的分類需要400個時間單位;總共10*400=4000。
一旦每一部分被分類,將它們重新合併將需要大約200個時間單位;總計200+4000=4200。顯然,4200比40000是一個顯著的進步。
現在想想更大點。設想將原始陣列分成兩組,然後對它們進行排序。最後,對陣列進行排序大約需要1000個時間單位。
這就是合併排序的工作原理。它使大陣列的排序變得容易,因此適用於大整數和字串陣列。合併排序演算法的時間複雜度在最佳、平均和最差情況下是相同的,等於O(n*log(n))。

順便說一下,如果你對演算法和資料結構很陌生,不熟悉Quas排序、二進位制搜尋、級搜尋等基本排序和搜尋演算法,那麼我建議你透過一個好的、全面的線上課程,比如資料結構和演算法:用Java深入學習基本知識。

使用合併排序演算法對陣列進行排序:
您已經給出了一個無序的整數列表(或任何其他物件,例如字串),您必須按其自然順序重新排列整數或物件。

Sample Input: {80, 50, 30, 10, 90, 60, 0, 70, 40, 20, 5}
Sample Output: {0, 10, 20, 30, 40, 50, 50, 60, 70, 80, 90}

import java.util.Arrays;

/*
 * Java Program to sort an integer array using merge sort algorithm.
 */

public class Main {

  public static void main(String args) {

    System.out.println("mergesort");
    int input = { 87, 57, 370, 110, 90, 610, 02, 710, 140, 203, 150 };

    System.out.println("array before sorting");
    System.out.println(Arrays.toString(input));

    // sorting array using MergeSort algorithm
    mergesort(input);

    System.out.println("array after sorting using mergesort algorithm");
    System.out.println(Arrays.toString(input));

  }

  /**
   * Java function to sort given array using merge sort algorithm
   * 
   * @param input
   */
  public static void mergesort(int input) {
    mergesort(input, 0, input.length - 1);
  }

  /**
   * A Java method to implement MergeSort algorithm using recursion
   * 
   * @param input
   *          , integer array to be sorted
   * @param start
   *          index of first element in array
   * @param end
   *          index of last element in array
   */
  private static void mergesort(int input, int start, int end) {

    // break problem into smaller structurally identical problems
    int mid = (start + end) / 2;
    if (start < end) {
      mergesort(input, start, mid);
      mergesort(input, mid + 1, end);
    }

    // merge solved pieces to get solution to original problem
    int i = 0, first = start, last = mid + 1;
    int tmp = new int[end - start + 1];

    while (first <= mid && last <= end) {
      tmp[i++] = input[first] < input[last] ? input[first++] : input[last++];
    }
    while (first <= mid) {
      tmp[i++] = input[first++];
    }
    while (last <= end) {
      tmp[i++] = input[last++];
    }
    i = 0;
    while (start <= end) {
      input[start++] = tmp[i++];
    }
  }
}

Output
mergesort
array before sorting
<p class="indent">[87, 57, 370, 110, 90, 610, 2, 710, 140, 203, 150]
array after sorting using mergesort algorithm
<p class="indent">[2, 57, 87, 90, 110, 140, 150, 203, 370, 610, 710]



您可以看到該陣列現已排序。 我們使用的演算法是合併排序的遞迴實現,它也是一個穩定的排序演算法。

無論如何,如果你還沒有得到合併排序演算法的工作原理,你還可以檢視演算法和資料結構 - 關於Pluralsight的第1部分和第2部分課程,它以非常好的方式解釋了鍵排序和搜尋演算法。 它還包括基本資料結構,如連結串列,陣列,雜湊表,二叉樹等。

 

相關文章