归并排序算法
归并排序:
归并排序将待排序数组A[1..n]分成两个各含n/2个元素的子序列,然后对这个两个子序列进行递归排序,最后将这两个已排序的子序列进行合并,即得到最终排好序的序列
(图片来自百度百科)
1 package com.wx.demo; 2 3 import java.util.Arrays; 4 5 public class MergeSort { 6 public static void main(String[] args) { 7 int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 8 sort(arr); 9 System.out.println(Arrays.toString(arr)); 10 } 11 12 public static void sort(int[] arr) { 13 int[] temp = new int[arr.length];// 在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间 14 sort(arr, 0, arr.length - 1, temp); 15 } 16 17 private static void sort(int[] arr, int left, int right, int[] temp) { 18 if (left < right) { 19 int mid = (left + right) / 2; 20 sort(arr, left, mid, temp);// 左边归并排序,使得左子序列有序 21 sort(arr, mid + 1, right, temp);// 右边归并排序,使得右子序列有序 22 merge(arr, left, mid, right, temp);// 将两个有序子数组合并操作 23 } 24 } 25 26 private static void merge(int[] arr, int left, int mid, int right, int[] temp) { 27 int i = left;// 左序列指针 28 int j = mid + 1;// 右序列指针 29 int t = 0;// 临时数组指针 30 while (i <= mid && j <= right) { 31 if (arr[i] <= arr[j]) { 32 temp[t++] = arr[i++]; 33 } else { 34 temp[t++] = arr[j++]; 35 } 36 } 37 while (i <= mid) {// 将左边剩余元素填充进temp中 38 temp[t++] = arr[i++]; 39 } 40 while (j <= right) {// 将右序列剩余元素填充进temp中 41 temp[t++] = arr[j++]; 42 } 43 t = 0; 44 // 将temp中的元素全部拷贝到原数组中 45 while (left <= right) { 46 arr[left++] = temp[t++]; 47 } 48 } 49 }