算法之归并排序
package com.ebiz.sort; import java.util.Arrays; /** * @author YHj * @create 2019-09-03 22:21 * /** * 归并排序(递归) * * ①. 将序列每相邻两个数字进行归并操作,形成 floor(n/2)个序列 * ②. 执行①直到每组有一个元素
* ③. 各组之间进行比较 * ④. 重复步骤③,直到所有元素排序完毕。 */ public class Merge { public static void main(String[] args) { int [] arr = {8,4,5,7,1,3,6,2,9}; mergingSort(arr); } public static int[] mergingSort(int[] arr){ if(arr.length <= 1){ return arr; } int num = arr.length >> 1; int[] leftArr = Arrays.copyOfRange(arr, 0, num); int[] rightArr = Arrays.copyOfRange(arr, num, arr.length); System.out.println("split two array: " + Arrays.toString(leftArr) + " And " + Arrays.toString(rightArr)); return mergeTwoArray(mergingSort(leftArr), mergingSort(rightArr)); //不断拆分为最小单元,再排序合并 } private static int[] mergeTwoArray(int[] arr1, int[] arr2){ int i = 0, j = 0, k = 0; int[] result = new int[arr1.length + arr2.length]; //申请额外的空间存储合并之后的数组 while(i < arr1.length && j < arr2.length){ //选取两个序列中的较小值放入新数组 if(arr1[i] <= arr2[j]){ result[k++] = arr1[i++]; }else{ result[k++] = arr2[j++]; } } while(i < arr1.length){ //序列1中多余的元素移入新数组 result[k++] = arr1[i++]; } while(j < arr2.length){ //序列2中多余的元素移入新数组 result[k++] = arr2[j++]; } System.out.println("Merging: " + Arrays.toString(result)); return result; } }