Java中的合併排序演算法
合併排序演算法是一種分而治之的演算法。在分而治之的正規化中,一個問題被分解成較小的問題,其中每個小問題仍然保留著大問題的所有屬性——大小除外。為了解決原始問題,每個部分都是單獨解決的,然後這些部分又合併在一起。例如,假設您必須使用氣泡排序演算法對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部分課程,它以非常好的方式解釋了鍵排序和搜尋演算法。 它還包括基本資料結構,如連結串列,陣列,雜湊表,二叉樹等。
相關文章
- #排序演算法#【5】合併排序排序演算法
- 演算法合併排序陣列演算法排序陣列
- 排序演算法__歸併排序排序演算法
- 排序演算法:歸併排序排序演算法
- 歸併排序--排序演算法排序演算法
- 排序演算法 - 歸併排序排序演算法
- 排序演算法——歸併排序排序演算法
- 排序演算法(歸併排序)排序演算法
- 排序演算法之 '歸併排序'排序演算法
- java歸併排序Java排序
- [java]歸併排序Java排序
- Java 集合中的排序演算法淺析Java排序演算法
- 淺談演算法和資料結構(3):合併排序演算法資料結構排序
- MapReduce(三):分割槽、排序、合併排序
- 演算法基礎~連結串列~排序連結串列的合併(k條)演算法排序
- ForkJoin和氣泡排序組合實現的歸併排序排序
- 演算法:排序連結串列:歸併排序演算法排序
- 排序演算法總結之歸併排序排序演算法
- 演算法之常見排序演算法-氣泡排序、歸併排序、快速排序演算法排序
- 演算法之歸併排序演算法排序
- java 合併pdfJava
- 演算法系列(四)排序演算法中篇--歸併排序和快速排序演算法排序
- 合併K個排序連結串列排序
- 【JAVA演算法】排序演算法 -- 快速排序Java演算法排序
- 《排序演算法》——快速排序(Java)排序演算法Java
- Java 在Word中建立郵件合併模板併合並文字和圖片Java
- 排序演算法之「歸併排序(Merge Sort)」排序演算法
- 演算法(氣泡排序,快排,歸併排序)演算法排序
- Java實現歸併排序Java排序
- 資料結構與演算法——排序演算法-歸併排序資料結構演算法排序
- 演算法學習 – 歸併排序演算法排序
- 演算法學習 - 歸併排序演算法排序
- 淺談歸併排序:合併 K 個升序連結串列的歸併解法排序
- 排序合併連線(sort merge join)的原理排序
- 排序演算法-Java排序演算法Java
- 【分治演算法】歸併排序,快速排序和漢諾塔演算法排序
- 歸併排序 nO(lgn) 稽核中排序
- java List中相同的資料合併到一起Java