实现归并排序java(分治与递归)

	// 归并排序的基本思想是分治
	// 将数组分成两个部分,然后将左右数组按大小进行排序并返回新的数组
	// 归并方法用用到了递归,终止递归的条件是当数组只有一个元素的时候停止
	// 为了标记左右数组需要两个指针分别记录做数组的起始位置和右数组的起始位置
	// 实际上只要知道数组最右面值的下标也可以获取到右数组的起始位置,所以只需要传入数组的起始位置和末尾位置即可
	public static int[] mergeSort(int[] arr, int left, int right) {
		//递归的终止条件当起始下标等于末尾下标的时候说明只剩下一个元素
		//此时停止递归并将该元素返回
		if(left == right) {	
			return new int[] {arr[left]};
		}
		int L = left;	// 左数组的起始位置
		int M = (left + right) / 2;	// 左数组的末尾位置
		int[] leftArr = mergeSort(arr, L, M); //左数组递归使左数组有序
		int[] rightArr = mergeSort(arr, M + 1, right); //右数组递归使右数组有序
		int[] newArr = new int[leftArr.length + rightArr.length];	//创建新的数组用来存放左数组和右数组
		int m = 0, j = 0, i = 0; //m指针指向newArr数组 j指针指向右数组 i指针指向左数组
		while (i < leftArr.length && j < rightArr.length) {
			//将两个数组按大小放入到新数组中只到左数组或者右数组中的任意一个数组全部放到新数组中为止
			newArr[m++] = leftArr[i] < rightArr[j] ? leftArr[i++] : rightArr[j++];
		}
		//如果左数组中还有剩余的元素就将剩余的元素全部放到新数组中
		while(i < leftArr.length) {
			newArr[m++] = leftArr[i++];
		}
		//如果右数组中还有剩余的元素就将剩余的元素全部放到新数组中
		while(j < rightArr.length) {
			newArr[m++] = rightArr[j++];
		}
		return newArr;
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值