标签:
任何的递归算法都可以转换为非递归算法,而且一般来说递归算法的效率比非递归算法的效率低。但是为啥会有递归算法呢,是因为递归算法看起来思路清晰,而且代码简洁。接下来我主要介绍下归并算法的非递归实现。
主要思想:对于归并算法的非递归实现,我们可以沿着递归实现的逆向方向去思考,递归的思想是自顶向下,将待排序序列不断分解,然后再归并。而非递归的思想就是自底向上,先两两归并,然后再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