自己总结的Java归并排序代码

 看了网上的许多博客,然后自己总结了下,谢谢大神们的贡献

public class MergeSort {

    public void sort(int[] arr, int lo, int hi) {
        if (lo >= hi) return;
        int mid = lo + (hi - lo)/2;
        sort(arr, lo, mid);
        sort(arr, mid+1,hi);
        merge(arr,lo,mid,hi);
    }

    public void merge(int[] a, int lo, int mid, int hi) {
        //临时数组,用来排放合并后的数组
        int[] tmp = new int[hi-lo+1];
        //前半段的指针,前半段a[lo ... mid]
        int i = lo;
        //后半段指针,后半段a[mid+1 ... hi]
        int j = mid+1;
        //tmp 指针
        int k = 0;

        //前半段后半段做比较,较小的值放在临时数组,然后指针+1
        while (i<=mid && j<=hi) tmp[k++] = a[i] < a[j] ? a[i++] : a[j++];
//因为上面是与操作,所以任意其中一个条件不满足就会跳出循环,而此时数组可能没放满,因此下面两个while用来填数组 //这两个while是互斥的,只能进其中一个 while (i<=mid) tmp[k++]=a[i++]; while (j<=hi) tmp[k++]=a[j++]; //这里的判断条件一定是小于k,因为再放完最后一个数后,由于k++,所以k又自增1,如果取t<=k,会引发索引越界 //这步的作用就是将临时数组的值放回原数组,因为是递归调用,所以要记得加上左边界lo for (int t=0;t<k;t++) a[lo+t] = tmp[t]; } public static void main(String[] args) { int[] a = {-523,645,34,2,8567,1,234,-534,12,678,-34,43,7,-5867,-56,23,0,4,-1234,6,867,56,3,0,5,-3,654,78,54,53,2}; //最终测试 new MergeSort().sort(a,0,a.length-1); System.out.println(Arrays.toString(a)); } }
原文地址:https://www.cnblogs.com/tudoo/p/14813460.html