1. 程式人生 > >JAVA實現歸併排序

JAVA實現歸併排序

歸併排序(Merge)是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。 將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為2-路歸併。

歸併排序演算法穩定,陣列需要O(n)的額外空間,連結串列需要O(log(n))的額外空間,時間複雜度為O(nlog(n)),演算法不是自適應的,不需要對資料的隨機讀取。

工作原理:

1、申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列

2、設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

3、比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

4、重複步驟3直到某一指標達到序列尾

5、將另一序列剩下的所有元素直接複製到合併序列尾

程式碼實現:

/** 
 *  歸併排序演算法 
 * 
 * @param srcArray 待排序陣列 

 */  
public class MergeSort {
    public static void main(String[] args){
         int
[] srcArray = {30,32,3,5,21,17,101,55,16,82}; System.out.println("排序前:"+Arrays.toString(srcArray)); mergeSort(srcArray, 0, srcArray.length-1); System.out.println("排序後:"+Arrays.toString(srcArray)); } // 歸併排序實現 private static void mergeSort(int[] srcArray, int low, int
high) { if (low >= high) return; // 找出中間索引 int mid = low + (high - low)/2; // 對左邊陣列進行遞迴 mergeSort(srcArray, low, mid); // 對右邊陣列進行遞迴 mergeSort(srcArray, mid + 1, high); // 左右合併 merge(srcArray,low,mid,high); } private static void merge(int[] srcArray, int low, int mid, int high) { int[] temp = new int[high - low +1]; // 左指標 int i = low; // 右指標 int j = mid + 1; int k = 0; // 把較小的數先移到新陣列中 while (i <= mid && j <= high) { // 從兩個陣列中取出最小的放入臨時陣列 if(srcArray[i] <= srcArray[j]) { temp[k++] = srcArray[i++]; }else { temp[k++] = srcArray[j++]; } } // 剩餘部分依次放入臨時陣列(實際上兩個while只會執行其中一個) while(i <= mid) { temp[k++] = srcArray[i++]; } while(j <= high) { temp[k++] = srcArray[j++]; } // 將臨時陣列中的內容拷貝回原陣列中 // (原high-low範圍的內容被複制回原陣列) for(int m = 0; m <temp.length; m++) { srcArray[low + m] = temp[m]; } } }

輸出結果:

排序前:[30, 32, 3, 5, 21, 17, 101, 55, 16, 82]
排序後:[3, 5, 16, 17, 21, 30, 32, 55, 82, 101]

相關推薦

java實現歸併排序

歸併排序:顯示不停的分割,一次分一半。。。直到分到全部為單個的時候,然後在慢慢合併回來。 程式碼: package test2018926; public class MergeSort { public static void main(String[] args) {

Java實現--歸併排序(遞迴)

《Java資料結構和演算法》如此描述分治演算法: 把一個大問題分成兩個相對來說更小的問題,並且分別解決每一個小問題,對每一個小問題的解決方案是一樣的:把每個小問題分成兩個更小的問題,並且解決它們。這個過程一直持續小去知道達到易於求解的基值情況,就不用再繼續分了。 時間複雜度:

java實現歸併排序演算法

前面我們講了歸併排序演算法,接下來我們來用java程式碼實現唄,如下 package ttt; import java.util.Arrays; public class MergeSort { public static int[] lastMergeSort(in

java實現歸併排序(思想與實現

歸併排序歸併排序是採用分治法的一個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至一個數組為空,最後把另一個數組的剩餘部分複

排序演算法Java實現——歸併排序

歸併排序(也可以叫合併排序),其實歸併排序的本質就是合併排序。 它是與插入排序、交換排序、選擇排序不同的一類排序方法,不同之處在於: 它要求:待排序序列是由若干個有序子序列組成。 那麼究竟什麼是歸併排序呢?歸併這個詞到底是什麼意思? 首先可以理解為就是合併,然後就是這個詞的

Java實現歸併排序與總結

一、思路1.劃分:用遞迴的思想將陣列進行劃分,劃分原則類似於二分查詢,直到劃分單元的元素個數為1.2.歸併:在將同層的兩個有序子組歸併成一個有序子組,複製一個將兩個有序子組合並的陣列,設定兩個遊標,初始位置為複製陣列對應的兩個有序子組的起始位置,比較兩個遊標所指向的元素的大小,將小的元素放入到合併空間,直到歸

Java實現歸併排序

public class MergeSort {         //每一次的歸併操作private void merge(int[] a, int[] b, int l, int m, int h) {int i, j, k;for (k = l, j = m + 1; l <= m &&am

JAVA實現歸併排序

歸併排序(Merge)是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and C

基於Java實現歸併排序

歸併排序 public static void mergeSort(int[] arr) { if (arr == null || arr.length < 2) { return; }

Java歸併排序的非遞迴實現 資料結構與演算法合集 資料結構與演算法合集

  歸併排序可以採用遞迴方法(見:歸併排序),但遞迴方法會消耗深度位O(longn)的棧空間,使用歸併排序時,應該儘量使用非遞迴方法。本文實現了java版的非遞迴歸併排序。 更多:資料結構與演算法合集 思路分析   遞迴排序的核心是merge(int[] arr, int start, int mid,

Java程式碼實現歸併排序

Java程式碼實現歸併排序 歸併排序(Merge Sort) 思路:如果要排序一個數組,我們先把陣列從中間分成前後兩部分,然後對前後兩部分分別排序,再將排好序的兩部分合並在一起,這樣整個陣列就都有序了。 所以說歸併排序的核心思想是排序和合並兩個有序陣列,這個規程需要用遞迴來實

Java實現快速排序歸併排序、堆排序和希爾排序

快速排序 演算法思想 1.將陣列的第一個元素取為target,定義兩個指標i 和 j; 2.指標i ,從左向右找到第一個比target大的元素,指標j從右向左找到第一個比target小的元素,

遞迴和迭代兩種方式實現歸併排序Java版)

遞迴版 package MergeSort; import Utils.SortUtils; /** * 歸併排序遞迴版 * @author liguodong */ pub

Java實現排序演算法及比較 [冒泡,選擇,插入,歸併,希爾,快排]

      排序演算法的穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri=rj,且ri在rj之前, 而在排序後的序列中,ri仍在rj之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。 氣泡排序:穩

Java 實現冒泡排序

string 復雜度 nbsp ras 計算 plain length lai article 冒泡排序: 就是按索引逐次比較相鄰的兩個元素,假設大於/小於(取決於須要升序排還是降序排)。則置換,否則不做改變 這樣一輪下來。比較了n-1次。n等於元素的個數;n-

Java實現快速排序

static nlogn -- 可能 超過 highlight uic 數組 images 一、快速排序的思想   基於分治的思想,是冒泡排序的改進型。首先在數組中選擇一個基準點(該基準點的選取可能影響快速排序的效率,後面講解選取的方法),然後分別從數組的兩端掃描數組,設兩

使用java實現快速排序的一個簡單例子

fast val rgs 快速 實現 個數 static void sta public static void main(String[] args) { // 測試排序 Random r = new Random(); int arr[] = new

使用java實現快速排序(我認為是最簡單最容易理解的版本)

一切都在程式碼和註釋之中。複製貼上就能跑,邊跑邊看才是最愉快的。 所以,話不多說,放碼過來。   public class QuickSort { public static void main(String[] args) { int x[]={6,1,2,7,9,1

分治法 實現歸併排序

分治法 實現歸併排序 1 問題描述   二路歸併排序,不仔細詳解了。之所以記錄是因為被坑了, 詳細看程式碼 2 python 實現 def merge(row_data, result_data, start, center, end): i = start j = center

java實現快速排序一種常規的,一種是左程雲的方式。

java實現快速排序: 一:先來一個常規快排: 這個方式就是我們的基準值一直在兩個邊界徘徊,要麼在less的較大邊界,要麼是在more的小邊界,其實就是在居中位置徘徊。 package chapter1; //來一個快排,常規快排 public class QuickSort {