归并排序-递归实现-java

  1. 用递归的归并排序需要深度为LogN的栈空间,虽然代码很简单易懂,但是会造成时间和空间上的性能损耗,为了优化归并排序,我们可以使用迭代代替递归。
//使用递归的方式进行归并排序,所需要的空间复杂度是O(N+logN)。
//怎么理解这个递归?就把它当做只能分成两个子序列即可。
public class ZZ {
    public static void main(String[] args) {
        int[] arr = {3, 4, 2, 5, 7, 0, 9, 8, 1, 6};
        mergeSort(arr, 0, arr.length - 1);
        printArr(arr);
    }

    public static void mergeSort(int[] arr, int low, int high) {//low,high都是数组的坐标
           int middle=(low+high)/2;
           if(low<high){
               mergeSort(arr,low,middle);
               mergeSort(arr,middle+1,high);
               merge(arr,low,middle,high);//merge方法实际上是将两个有序数组合并成一个有序数组
           }
    }
    public static void merge(int[]arr,int low,int middle,int high){
        int[] temp=new int[high-low+1];//temp数组用于暂存合并的结果
        int i=low;
        int j=middle+1;
        int k;
        for (k=0 ;i<=middle && j<=high ;k++) {
            //大于的才交换
            if(arr[i]>arr[j]){
                temp[k]=arr[j];
                j++;
            }else{
                temp[k]=arr[i];
                i++;
            }
        }
        
        //以下两个while循环,只能执行一个。因为在上面的for循环终止条件的限制。
        while(i<=middle){
            temp[k]=arr[i];
            i++;
            k++;
        }
        while(j<=high){
            temp[k]=arr[j];
            j++;
            k++;
        }
        for (int l = 0; l <temp.length; l++) {
            arr[low+l]=temp[l];
        }
    }

    public static void printArr(int[] arr) {
        System.out.print("排序结果为: ");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值