Java递归实现归并排序

B站相关视频链接:

https://www.bilibili.com/video/BV1Ax411U7Xx?from=search&seid=4353605022032697603 

public class Main
{
	public static void main (String[] args)
	{
		int[] array = {2,5,6,1,4,3,9,6};
		int L = 0;
		int R = array.length - 1;
		//int M = L + (R - L) / 2;
		mergeSort(array, L, R);
		for(int i = 0; i < array.length; ++i) {
		    System.out.println(array[i] + " ");
		}
	}
	//将一个数组(array数组)的前半部分有序(left数组) + 后半部分有序(right数组) 合并成一整个有序数组
	private static void merge(int[] array, int L, int R) {
	    //System.out.println(" merge " + " L : " + L + " R : " + R);
	    int M = L + (R - L) / 2;
	    System.out.println(" merge " + " L : " + L + " R : " + R + " M " + M);
	    int[] left = new int[M - L + 1];
	    int[] right = new int[R - M];
	    int i = 0;
	    int j = 0;
	    int k = L;
	    for (int t = 0; t < left.length; ++t) {
	        left[t] = array[L + t];
	        System.out.println(" left[] " + left[t]);
	    }
	    for (int t = 0; t < right.length; ++t) {
	        right[t] = array[M + 1 + t];
	        System.out.println(" right[] " + right[t]);
	    }
	    while (i < left.length && j < right.length) {
	        if (left[i] <= right[j]) {
	            array[k ++] = left[i ++];
	        } else {
	            array[k ++] = right[j ++];
	        }
	    }
	    System.out.println(i);
	    System.out.println(j);
	    while (i < left.length) {
	        System.out.println("while i");
	        array[k ++] = left[i ++];
	    }
	    while (j < right.length) {
	        System.out.println("while j");
	        array[k ++] = right[j ++];
	    }
	}
	
	//分治,从M处递归的切一刀切一刀切一刀,递归停止条件是: L == R,即小数组中只剩一个元素
	
	private static void mergeSort(int[] array, int L, int R) {
	    //System.out.println(" mergeSort " + "L : " + L + " R : " + R);
	    if (L < R) {
	        int M = L + (R - L) / 2;
	        System.out.println(" mergeSort " + " L : " + L + " R : " + R + " M " + M);
	        mergeSort(array, L, M);
	        mergeSort(array, M + 1, R);
	        merge(array, L, R);
	    } else {
	        return;
	    }
	}
	
	
}

运行结果:

mergeSort  L : 0 R : 7 M 3
 mergeSort  L : 0 R : 3 M 1
 mergeSort  L : 0 R : 1 M 0
 merge  L : 0 R : 1 M 0
 left[] 2
 right[] 5
1
0
while j
 mergeSort  L : 2 R : 3 M 2
 merge  L : 2 R : 3 M 2
 left[] 6
 right[] 1
0
1
while i
 merge  L : 0 R : 3 M 1
 left[] 2
 left[] 5
 right[] 1
 right[] 6
2
1
while j
 mergeSort  L : 4 R : 7 M 5
 mergeSort  L : 4 R : 5 M 4
 merge  L : 4 R : 5 M 4
 left[] 4
 right[] 3
0
1
while i
 mergeSort  L : 6 R : 7 M 6
 merge  L : 6 R : 7 M 6
 left[] 9
 right[] 6
0
1
while i
 merge  L : 4 R : 7 M 5
 left[] 3
 left[] 4
 right[] 6
 right[] 9
2
0
while j
while j
 merge  L : 0 R : 7 M 3
 left[] 1
 left[] 2
 left[] 5
 left[] 6
 right[] 3
 right[] 4
 right[] 6
 right[] 9
4
2
while j
while j
1 
2 
3 
4 
5 
6 
6 
9 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值