public class Solution { /* * 将一个数组中的两个相邻有序区间合并成一个 * * 参数说明: * a -- 包含两个有序区间的数组 * start -- 第1个有序区间的起始地址。 * mid -- 第1个有序区间的结束地址。也是第2个有序区间的起始地址。 * end -- 第2个有序区间的结束地址。 */ public static void main(String [] args){ int[] t = {18,7,8,6,33,2,9,1}; mergSort(t,0,7); for (int i = 0;i<t.length;i++) System.out.print(t[i] + " "); } public static void mergSort(int [] arr,int l,int r){ if(l>=r) return; int mid = (l+r)/2; //递归二分 将数组分为 [左,中],(中,右] mergSort(arr,l,mid); mergSort(arr,mid+1,r); //归并排序 int aux[] = new int[r-l+1]; //这里弄一个要处理的数组副本 长度是 R-L+1 for (int i =l;i<=r ;i++) //副本数组从 L 开始,所以与原数组存在一个 L 的偏移量 aux[i-l] = arr[i]; int i = l,j = mid+1; //i记录左边元素的下标位置 j记录右边元素的下标位置 for (int k =l;k <= r; k++){ //k记录 arr 的下标位置 if(i >mid){//第一个数组用完,用第二个数组 arr[k] = aux[j-l]; j++; }else if(j >r){//第二个数组用完了,用第一个数组
arr[k] = aux[i-l]; i++; }else if(aux[i-l] < aux[j-l]){//比较两个数组的第一个数,谁小放谁,大的指针不变,直达他说最小的 arr[k] = aux[i-l]; i++; }else{ arr[k] = aux[j-l]; j++; } } } }
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。