第一步:做數組的拆分
//歸並排序 public static void sort(int[] arr){ int[] tmp = new int[arr.length]; int left = 0 ; int right = arr.length-1 ; sortMerge(arr , left , right , tmp); } public static void sortMerge(int[] arr , int left , int right , int[] tmp){ if(left < right){ int mid = (left + right) / 2 ; sortMerge(arr , left , mid , tmp); sortMerge(arr , mid+1 , right , tmp); merge(arr , left , mid , right , tmp); } }
第二步:排序
這一步需要兩個指針:第一個指針是前面數組的初始指針 , 第二個指針是另外一個數組的初始指針
int i = left ; //左指針 int j = mid+1 ; //右指針
做排序:
public static void merge(int[] arr , int left , int mid , int right , int[] tmp){ int i = left ; //左指針 int j = mid+1 ; //右指針 int t = 0 ;//數組臨時指針 while (i <= mid && j <= right){ if(arr[i] <= arr[j]){ tmp[t++] = arr[i++]; }else{ tmp[t++] = arr[j++]; } } while (i <= mid){ tmp[t++] = arr[i++]; } while (j <= right){ tmp[t++] = arr[j++]; } t = 0 ; while (left <= right){ arr[left ++] = tmp[t++]; } }
全部代碼:

public class MergeSort { public static void main(String[] args) { int[] arr = {8,7,6,5,4,3,2,1} ; sort(arr); System.out.println(Arrays.toString(arr)); } public static volatile int index = 1 ; //歸並排序 public static void sort(int[] arr){ int[] tmp = new int[arr.length]; int left = 0 ; int right = arr.length-1 ; sortMerge(arr , left , right , tmp); } public static void sortMerge(int[] arr , int left , int right , int[] tmp){ if(left < right){ int mid = (left + right) / 2 ; sortMerge(arr , left , mid , tmp); sortMerge(arr , mid+1 , right , tmp); merge(arr , left , mid , right , tmp); } } public static void merge(int[] arr , int left , int mid , int right , int[] tmp){ int i = left ; //左指針 int j = mid+1 ; //右指針 int t = 0 ;//數組臨時指針 while (i <= mid && j <= right){ if(arr[i] <= arr[j]){ tmp[t++] = arr[i++]; }else{ tmp[t++] = arr[j++]; } } while (i <= mid){ tmp[t++] = arr[i++]; } while (j <= right){ tmp[t++] = arr[j++]; } t = 0 ; while (left <= right){ arr[left ++] = tmp[t++]; } } }