1.动画展示
2.思路分析
归并排序就是递归得将原始数组递归对半分隔,直到不能再分(只剩下一个元素)后,开始从最小的数组向上归并排序
1. 向上归并排序的时候,需要一个暂存数组用来排序,
2. 将待合并的两个数组,从第一位开始比较,小的放到暂存数组,指针向后移,
3. 直到一个数组空,这时,不用判断哪个数组空了,直接将两个数组剩下的元素追加到暂存数组里,
4. 再将暂存数组排序后的元素放到原数组里,两个数组合成一个,这一趟结束。
3.复杂度分析
1. 时间复杂度:递归算法的时间复杂度公式:T[n] = aT[n/b] + f(n) **

无论原始数组是否是有序的,都要递归分隔并向上归并排序,所以时间复杂度始终是O(nlog2n)
2. 空间复杂度:
每次两个数组进行归并排序的时候,都会利用一个长度为n的数组作为辅助数组用于保存合并序列,所以空间复杂度为O(n)。
4.代码实现
public class MergeSort {public static void main(String[] args) {int arr[] = { 8, 4, 5, 7, 1, 3, 6, 2 };System.out.println("归并排序前:"+Arrays.toString(arr));int[] temp = new int[arr.length];mergeSort(arr,0,arr.length-1,temp);System.out.println("归并排序后:"+Arrays.toString(arr));}//分+合方法public static void mergeSort(int[] arr, int left, int right, int[] temp){if (left<right){int mid = (right+left)/2;//向左递归进行分解mergeSort(arr,left,mid,temp);//向右递归进行分解mergeSort(arr,mid+1,right,temp);//合并merge(arr, left, mid, right, temp);}}//合并的方法/**** @param arr 排序的原始数组* @param left 左边有序序列的初始索引* @param mid 中间索引* @param right 右边索引* @param temp 做中转的数组*/public static void merge(int[] arr, int left, int mid, int right, int[] temp){ //合并了7次int i = left; // 初始化i, 左边有序序列的初始索引int j = mid + 1; //初始化j, 右边有序序列的初始索引int t = 0; // 指向temp数组的当前索引//(一)//先把左右两边(有序)的数据按照规则填充到temp数组//直到左右两边的有序序列,有一边处理完毕为止while (i<=mid && j<=right){//如果左边的有序序列的当前元素,小于等于右边有序序列的当前元素//即将左边的当前元素,填充到 temp数组if (arr[i] <= arr[j]){temp[t] = arr[i];t += 1;i += 1;}else {//反之,将右边有序序列的当前元素,填充到temp数组temp[t] = arr[j];t += 1;j += 1;}}//(二)//把有剩余数据的一边的数据依次全部填充到tempwhile (i <= mid){//左边的有序序列还有剩余的元素,就全部填充到temptemp[t] = arr[i];t += 1;i += 1;}while (j<=right){//右边的有序序列还有剩余的元素,就全部填充到temptemp[t] = arr[j];t += 1;j += 1;}//将temp数组的元素拷贝到arr//注意,并不是每次都拷贝所有t = 0;// int tempLeft = left;System.out.println("合并,"+"left:"+left+";right:"+right);while(left <= right){arr[left] = temp[t];t += 1;left += 1;}}}
运行结果
归并排序前:[8, 4, 5, 7, 1, 3, 6, 2]合并,left:0;right:1 //索引,说明合并了7次,每次合并后的数组都是有序的合并,left:2;right:3合并,left:0;right:3合并,left:4;right:5合并,left:6;right:7合并,left:4;right:7合并,left:0;right:7归并排序后:[1, 2, 3, 4, 5, 6, 7, 8]Process finished with exit code 0



