码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2021-06-02 11:26:03      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:return   div   tmp   填数组   while   排序   跳出循环   测试   总结   

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

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)); } }

 

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

标签:return   div   tmp   填数组   while   排序   跳出循环   测试   总结   

原文地址:https://www.cnblogs.com/tudoo/p/14813460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!