关于归并排序的练手

归并排序涉及二分法思想并采用了递归函数(即分治算法),将待排序的数列按照先对做左半部分进行排序,再对右半部分进行排序,最后再归并到一个数组里。以前课上听了可是没有动手去写一写,觉得挺简单,可是现在想写却发现自己有许多的问题。现在终于都可以通过了 ,whatever 还是该总结下了

package homework;
import java.util.*;
import java.util.Arrays;

public class mergeSort {

    static int[] mSort(int[] a,int l,int r){
        int mid = (r+l)/2;
        if(r>l){
         int[] left = Arrays.copyOfRange(a, l, mid+1);
         int[] right = Arrays.copyOfRange(a, mid+1, r+1);
         left=mSort(left,0,left.length-1);
         right=mSort(right,0,right.length-1);
          return merge(a,left,right);
        }
        return a;

    }
    static int[] merge(int[] a,int[] b,int[] c){
        int i=0,l=0,r=0;
            while(l<b.length && r<c.length){
                if(b[l]<=c[r]){
                    a[i++]=b[l++];
                }

                else{ a[i++]=c[r++];
                }
            }
            while(l<b.length){ a[i++]=b[l++];}
            while(r<c.length){ a[i++]=c[r++];   }

        return a;
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入数组大小:");
        int N = input.nextInt();
        int[] arr = new int[N];
        System.out.println("请输入数组,用空格隔开数据:");
        for(int i=0;i<N;i++){
            arr[i]=input.nextInt();
        }
        arr=mSort(arr,0,arr.length-1);
        for(int x: arr){
            System.out.print(x+" ");
        }

        input.close();
    }

}

刚开始遇到的问题是 就是把返回值设会VOID型没有改变原数组,再者就是调用到java的库函数Arrays.copyOfRange(a[],from,to);时没有搞清楚to是所要达到目标的后一下标值。本先要到达数组的最右端却一直只到达数组的右端前一个,导致排序结果一直不正确。
接着就是merge()的数组溢出问题,本先第一个循环里设了两个if语句,可是若要归并的数组里b和c里都只有一个数字,那么在第一个IF实现过后l++再比较b[l]与c[r]就会使得l下标越界的问题。最后这点小BUG改正后终于把归并排序写好了…
所以没事还是要多动动手…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值