MergeSort
Mon, Jun 28, 2021
閱讀時間 2 分鐘
MergeSort
Time complexity = log n * O(n) = O(n logn)
MergeSort 套一句柯P 講的話,小問題解決了,就沒有大問題了
將 n 個個數的陣列,先左右各切一半,一直切,切到最小單位後,開始拿兩條被切的單位做排序、合併 !
合久必分,分久必合
import java.util.*;
public class MergeSort {
public static void mergeSort(int[] array) {
int[] workArray = new int[array.length];
Sort(array, workArray, 0, array.length - 1);
}
private static void Sort(int[] array, int[] workArray, int start, int end) {
if (start >= end) return;
//避免溢位 start + end 可能超出去
int mid = start + (end - start)/2;
Sort(array, workArray, start, mid);
Sort(array, workArray, mid+1, end);
Merge(array, workArray, start, mid, mid+1, end);
}
private static void Merge(int[] array, int[] workArray, int leftStart, int leftEnd, int rightStart, int rightEnd) {
int leftPtr = leftStart, rightPtr = rightStart, index = leftStart;
while (leftPtr <= leftEnd || rightPtr <= rightEnd) {
if (leftPtr <= leftEnd && rightPtr <= rightEnd) {
//最後一排
if (array[rightPtr] < array[leftPtr])
workArray[index] = array[rightPtr++];
else
workArray[index] = array[leftPtr++];
} else if (leftPtr <= leftEnd){
// 左邊排序
workArray[index] = array[leftPtr++];
}else{
// 右邊排序
workArray[index] = array[rightPtr++];
}
++index;
}
for (int i = leftStart; i < index; i++)
array[i] = workArray[i];
}
public static void main(String[] args) {
int[] data = new int[10];
for (int i = 0; i < data.length; i++) {
data[i] = (int) (Math.random() * 100);
}
System.out.println("before: " + Arrays.toString(data));
mergeSort(data);
System.out.println("after: " + Arrays.toString(data));
}
}
![MergeSortResult](images/Algorithm/mergeSort/mergeSortResult.png)
演算法序列,會用來記錄算法,再用自己或其他人寫的 code 我能吸收的做紀錄,目的是讓自己能多看,然後背起來