归并排序(Merge Sort)是建立再归并操作上的一种有效的,稳定的排序算法,该算法是采用分治法(Divide and Conquer),将需要排序的数组通过递归的方式进行拆分成多层小的数组,对拆分后的子序列进行排序,再将已有的子序列合并,得到完全有序的子序列。也就是说,先将每个子序列有序,再使子序列间有序。分段可以理解为递归的拆分子序列的过程(递归的深度为:以2为底n的对数),将产生的若干子序列递归合并成一个真正的有序序列(递归深度同样为:以2为底n的对数)。
实例代码:
public class PracticeTest { public static void main(String[] args) { int []arr = {67,23,90,1,4,2,8,6}; System.out.println("排序前:"); System.out.println(Arrays.toString(arr)); sort(arr); System.out.println("排序后:"); System.out.println(Arrays.toString(arr)); } private static void sort(int [] arr){ int [] tmp = new int[arr.length]; mergeSort(arr,0,arr.length-1,tmp); } private static void mergeSort(int [] arr,int left,int right,int [] tmp){ if(left < right){ int med = (left+right)/2;//获取中值进行子序列拆分; mergeSort(arr,left,med,tmp);//拆分左侧子序列; mergeSort(arr,med+1,right,tmp);//拆分右侧子序列; merge(arr,left,med,right,tmp);//合并子序列; } } private static void merge(int [] arr,int left,int med,int right,int [] tmp){ //规定指针 int i = left; int j = med + 1; int t = 0; //对两个子序列进行拆分 while(i <= med && j <=right){ if(arr[i] <= arr[j]){ tmp[t++] = arr[i++]; } else { tmp[t++] = arr[j++]; } } //将左侧剩余的数据并入到tmp中 while(i <= med){ tmp[t++] = arr[i++]; } //将右侧剩余的数据并入到tmp中 while(j<=right){ tmp[t++] = arr[j++]; } t = 0; //将tmp中排序完成的数组数据,更新到arr数组中去; while(left <= right){ arr[left++] = tmp[t++]; } } }