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