標籤:演算法 length string 複雜度 記憶體 空間 申請 size color
簡介:
歸併(Merge)排序法是將兩個(或兩個以上)有序表合并成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合并為整體有序
基本思想:
將一個無序數組,利用遞迴和分治的方法劃分為最小半子集,最終劃分為完全二叉樹。然後對半子集進行排序並進行遞迴合并到最後。
複雜度分析:
時間複雜度為O(nlogn)
空間複雜度為O(n+logn)
兩兩比較,不存在跳躍,因此歸併排序是一種穩定的排序演算法
歸併排序是一種比較占記憶體,但卻效率高且穩定的演算法
工作原理
(1)申請空間,大小為兩個半子集大小的空間,用來存放兩個半子集排序合并後的資料
(2)設定兩個指標,最初位置分別為兩個半子集的起始位置
(3)比較兩個指標所指向的元素,選擇相對小的元素放入到合并空間,並移動指標到下一位置
(4)重複步驟3直到某一指標達到序列尾
(5)將另一序列剩下的所有元素直接複製到定序序列尾
排序過程詳解:
以執行個體:12,4,13,25,92,11,9,3,2 進行排序
排序結果:2,3,4,9,11,12,13,25,92
具體代碼如下:
package com.chengxuyuanzhilu.one;import java.util.Arrays;public class MergeSort { public static int[] sort(int[] nums, int low, int high) { int mid = (low + high) / 2; if (low < high) { // 左邊 sort(nums, low, mid); // 右邊 sort(nums, mid + 1, high); // 左右歸併 merge(nums, low, mid, high); } return nums; } public static void merge(int[] nums, 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 (nums[i] <= nums[j]) { temp[k++] = nums[i++]; } else { temp[k++] = nums[j++]; } } // 把左邊剩餘的數移入數組 while (i <= mid) { temp[k++] = nums[i++]; } // 把右邊邊剩餘的數移入數組 while (j <= high) { temp[k++] = nums[j++]; } // 把新數組中的數覆蓋nums數組 for (int k2 = 0; k2 < temp.length; k2++) { nums[k2 + low] = temp[k2]; } } // 歸併排序的實現 public static void main(String[] args) { int[] nums = {12,4,13,25,92,11,9,3,2}; MergeSort.sort(nums, 0, nums.length-1); System.out.println(Arrays.toString(nums)); } }
原文地址:http://guangboyuan.cn/archives/50
歸併排序演算法-Java實現