常见排序算法-----归并排序
1 // 归并排序 2 /** 3 * 利用分而治之的思想, 将大的无序数组拆分 一直拆到不能再拆位置,进行合并 4 * 5 * 很适合用于两个有序数组的合并 6 */ 7 public static void main(String[] args) { 8 9 MergeSort ms = new MergeSort(); 10 int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 11 ms.mergeSort(arr); 12 for (int i = 0; i < arr.length; i++) { 13 System.out.println(arr[i]); 14 } 15 16 } 17 18 public void mergeSort(int[] arr) { 19 // 先将数组分成左右两个数组 20 int[] temp = new int[arr.length]; 21 for (int i = 0; i < temp.length; i++) { 22 temp[i] = arr[i]; 23 } 24 sort(arr, 0, arr.length - 1, temp); 25 } 26 27 public void sort(int[] arr, int start, int end, int[] temp) { 28 29 if (start >= end) { 30 return; 31 } 32 33 int mid = (start + end) >> 1; 34 35 sort(arr, start, mid, temp);// 左边归并排序,使得左子序列有序 36 sort(arr, mid + 1, end, temp);// 右边归并排序,使得右子序列有序 37 merge(arr, start, mid, end, temp);// 将两个有序子数组合并操作 38 } 39 40 public void merge(int[] arr, int start, int mid, int end, int[] temp) { 41 42 int i = start; 43 int j = mid + 1; 44 int index = start; 45 while (i <= mid && j <= end) { 46 if (arr[i] < arr[j]) { 47 temp[index] = arr[i]; 48 i++; 49 } else { 50 temp[index] = arr[j]; 51 j++; 52 } 53 index++; 54 } 55 56 if (i == mid + 1) { 57 for (int k = j; k <= end; k++) { 58 temp[index] = arr[k]; 59 index++; 60 } 61 } else { 62 for (int k = i; k < mid + 1; k++) { 63 temp[index] = arr[k]; 64 index++; 65 } 66 } 67 for (int k = 0; k < temp.length; k++) { 68 arr[k] = temp[k]; 69 } 70 71 }
先拆分 拆分到最底层后 在排序合并 稳定算法 归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。
详见 https://www.cnblogs.com/chengxiao/p/6194356.html