日学一算法---归并排序(java实现)

前两天看到11年的一道阿里实习生笔试题,要求写一个Merge Sort,如下:


 分析Merge Sort的原理以及算法复杂度,并用最擅长的编程语言实现Merge Sort。


当时自己第一反应是递归写。

打开Eclipse写完,感觉效率比较低,然后又试着写了个非递归的。写完一看每次调用归并函数,就要new 一个数组,而且为了防止数组越界,还得申请和原始数组一样大的数组空间,感觉空间很浪费,又想着如何减少这空间的消耗,于是就写出了这一版本的非递归归并排序



class MergeSort {
	private int[] sr;
	private int[] res;
	
	public MergeSort(int[] sr) {
		this.sr = sr;
		this.res = new int[sr.length];
	}
	
	public void print() {
		for (int i : res) 
			System.out.printf("%3d", i);
		System.out.println();
	}
	
	public void sort() {
		int sub = 1;
		int cnt = 0;
		while(sub < sr.length) {
			mergePass(sub, cnt++);
			sub *= 2;
		}
		if((cnt & 1) == 0) {
			res = sr;
		}
	}
	
	private void mergePass(int sub, int cnt) {
		int i = 0;
		while(i + sub <= sr.length) {
			if(i + 2 * sub < sr.length) {
				if((cnt & 1) == 0) {
					merge(sr, res, i, i + sub, i + 2 * sub);
				} else {
					merge(res, sr, i, i + sub, i + 2 * sub);
				}
			} else {
				if((cnt & 1) == 0) {
					merge(sr, res, i, i + sub, sr.length);
				} else {
					merge(res, sr, i, i + sub, sr.length);
				}
			}
			i += 2 * sub;
		}
	}
	
	private void merge(int[] ary1, int[] ary2, int s, int m, int e) {
		int i = s, j = m, k = s;
		while(i < m && j < e) {
			if(ary1[i] < ary1[j]) {
				ary2[k++] = ary1[i++];
			} else {
				ary2[k++] = ary1[j++];
			}
		}
		while(i < m) {
			ary2[k++] = ary1[i++];
		}
		while(j < e) {
			ary2[k++] = ary1[j++];
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值