归并排序的递归与非递归实现理解(Java)

递归实现:

<span style="font-size:18px;"><span style="font-size:18px;">/**
 * Created by wqh on 2016/10/7.
 */
public class merge_recusion {
    public static void merge(int[] nums, int low, int mid, int high){
        int[] temp=new int[high-low+1];
        int i=low;
        int j=mid+1;
        int k=0;
        while(i<=mid && j<=high) {
            if (nums[i] > nums[j]) {
                temp[k++] = nums[j++];
            } else {
                temp[k++] = nums[i++];
            }
        }
        while(i<=mid){
            temp[k++]=nums[i++];
        }
        while(j<=high){
            temp[k++]=nums[j++];
        }
        for(int m=0; m<high-low+1; m++){
            nums[low+m]=temp[m];
        }
    }
    public static void sort(int[] array, int low, int high){
        int mid = (low+high)/2;
        if(low<high){
            sort(array, low, mid);
            sort(array, mid+1, high);
            merge(array, low, mid, high);
        }
    }
    public static void main(String[] args){
        int[] array=new int[]{1,212,32,4,65,423,5,4,345,32,89};
        sort(array,0,array.length-1);
        for(int element:array){
            System.out.print(element+" ");
        }
    }
}
</span></span>
非递归实现:

<span style="font-size:18px;"><span style="font-size:18px;">import com.sun.org.apache.bcel.internal.generic.ARRAYLENGTH;
import com.sun.scenario.effect.Merge;

/**
 * Created by wqh on 2016/10/7.
 */
public class merge_Non_recursion {
    //将两有序子数组进行重新排序
    public static void merge(int[] nums, int low, int mid, int high){
        int[] temp=new int[high-low+1];
        int i=low;
        int j=mid+1;
        int k=0;
        while(i<=mid && j<=high) {
            if (nums[i] > nums[j]) {
                temp[k++] = nums[j++];
            } else {
                temp[k++] = nums[i++];
            }
        }
        while(i<=mid){
            temp[k++]=nums[i++];
        }
        while(j<=high){
            temp[k++]=nums[j++];
        }
        for(int m=0; m<high-low+1; m++){
            nums[low+m]=temp[m];
        }
    }
    //将间隔s的子数组两两归并
    public static void MergePass(int[] array, int s, int len){
        int i=0;
        while(i<=len-2*s){
            merge(array, i, i+s-1, i+2*s-1);
            i+=2*s;
        }
        if(i<=len-s){
            merge(array, i, i+s-1, len-1);
        }
    }
    //子序列长度一次加倍
    public static void Merge_NonRecursion(int[] array){
        int k=1;
        while(k<array.length){
            MergePass(array,k,array.length);
            k*=2;
        }
    }
    public static void main(String[] args){
        int[] array=new int[]{1,22,34,12,34,43,5423,68,9,65,423,5,3,4,335,56,45,4,5,7,43,98,4,345,32,89};
        Merge_NonRecursion(array);
        for(int element:array){
            System.out.print(element+" ");
        }
    }
}
</span></span>

递归理解(虚拟栈、函数调用)和算法时间空间复杂度可参考牛人写的链接点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值