Java 实现Merge Sort 归并排序,使用辅助数组,降低merge方法的空间复杂度

本文主要加入了辅助数组,使得merge方法的空间复杂为O(n)。

import java.util.Arrays;

/*
 * 改进merge方法的空间复杂度,通过一个辅助数组,使得空间复杂度为O(n)
 * 1.把数组分为左右2个子数组(终止条件数组长度为1,不再分),分别进行mergeSort排序
 * 2.有序的左右子数组,合并到辅助数组
 * 3.从辅助数组中将修改了的数据复制会原数组
 * 
 */

public class MergeSort4 extends AbstractSort {

	@Override
	public void sort(int[] a) {
		if (a == null || a.length <= 1) {
			return;
		}
		// 辅助数组
		int[] copy = Arrays.copyOf(a, a.length);
		mergeSort(a, copy, 0, a.length - 1);

	}

	private void mergeSort(int[] a, int[] copy, int start, int end) {
		// 元素大于2个才进行mergeSort
		if (end > start) {
			int mid = (end + start) >> 1;
			mergeSort(a, copy, start, mid);
			mergeSort(a, copy, mid + 1, end);
			merge(a, copy, start, mid, mid + 1, end);
		}
	}
	
	/*
	 * 合并数据
	 */
	private void merge(int[] a, int[] copy, final int start1, final int end1, final int start2, final int end2) {
		int indexCopy = start1;
		int index1 = start1, index2 = start2;
		while (index1 <= end1 && index2 <= end2) {
			if (a[index1] < a[index2]) {
				copy[indexCopy++] = a[index1++];
			} else {
				copy[indexCopy++] = a[index2++];
			}
		}

		while (index1 <= end1) {
			copy[indexCopy++] = a[index1++];
		}

		while (index2 <= end2) {
			copy[indexCopy++] = a[index2++];
		}
		
		//将修改了的部分放会原数组
		for(int i=start1;i<=end2;i++) {
			a[i]=copy[i];
		}
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值