码迷,mamicode.com
首页 > 编程语言 > 详细

归并算法的非递归实现

时间:2016-05-13 01:32:55      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

任何的递归算法都可以转换为非递归算法,而且一般来说递归算法的效率比非递归算法的效率低。但是为啥会有递归算法呢,是因为递归算法看起来思路清晰,而且代码简洁。接下来我主要介绍下归并算法的非递归实现。

主要思想:对于归并算法的非递归实现,我们可以沿着递归实现的逆向方向去思考,递归的思想是自顶向下,将待排序序列不断分解,然后再归并。而非递归的思想就是自底向上,先两两归并,然后再4个4个一起归并,再8个。。。。。在这个过程中一定要注意尾部数据的处理,因为序列的长度不一定就是归并长度的整数倍。

代码实现:

这部分是单次归并的实现

public void merge(int[] a,int left,int mid,int right) {
		int[] tem = new int[a.length];
		int r1 = mid + 1;
		int tIndex = left;
		int cIndex = left;
		while (left <= mid && r1 <= right) {
			if (a[left] <= a[r1]) {
				tem[tIndex++] = a[left++];
			}else {
				tem[tIndex++] = a[r1++];
			}
		}
		while (left <= mid) {
			tem[tIndex++] = a[left++];
		}
		while (r1 <= right) {
			tem[tIndex++] = a[r1++];
		}
		while (cIndex <= right) {
			a[cIndex] = tem[cIndex];
			cIndex++;
		}
		/*for (int i = 0; i < tem.length; i++) {
			a[i] = tem[i];
			System.out.println(a[i]);
		}*/
	}

然后是自底向上分组归并

public void mergeSortF(int[] a){
		
		//每次归并的个数
		int flag = 0;
		for(int j = 2; j < a.length; j *= 2){
			//每次将多余的元素,不能进行但不归并的放入另一个辅助数组中,原数组将去掉放入的长度
			for (int i = 0; i < a.length; i += j) {
				if (a.length - i >= j) {
					//System.out.println(i);
					int q = (i + i + j - 1) / 2;
					//System.out.println(q);
					merge(a, i, q, i+j-1);
					//System.out.println("----");
				}else {
					merge(a, i, (i + a.length - 1) / 2, a.length - 1);
					//flag0 = j;
					flag = i;
					System.out.println();
					
				}
				
			}
		}
		//最后注意将尾部数据和前面的数据进行归并
		merge(a, 0, flag - 1, a.length - 1);
		
	}


归并算法的非递归实现

标签:

原文地址:http://blog.csdn.net/u014380418/article/details/51346318

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!