归并排序

归并排序采用的是分治的思想

将数组对半,再对半,再对半,再对半。。。直到最后的每一个数都成单独的一块(这里就是递归了,左半边递归,右半边递归)

再将拆开后的数组合并,合并是有序的合并,升序为例,则小的在前,大的在后。

最终得到的数组就是有序的数组

//这是一个归并排序,拆分加合并的方法
    public static int[] mergeSort(int [] array, int start, int end){
        if(start < end){
            //向左侧拆分递归
            int mid = (start + end) / 2;
            mergeSort(array,start,mid);
            mergeSort(array,mid+1,end);

            //归并,调用下面写的方法
            merge(array,start,mid,end);
        }
        return array;
    }

    public static void merge(int [] array, int left , int mid ,int right){
        int [] temp = new int [array.length];
        int start1 = left;//这是左边的指针,就是开始的指针
        int start2 = mid + 1;
        int t = left;//

        //第一步:按照左右两个半边进行合并,指针遍历小的就放进辅助数组temp中,直到有一边的数据以及全部放完
        while(start1 <= mid && start2<=right){
            if(array[start1]<=array[start2])
                temp[t++]=array[start1++];
            else
                temp[t++]=array[start2++];
        }

        //第二步:将左边或者右边没有填充完的数据直接添加到temp辅助数组中
        while (start1 <= mid){
            temp[t++] = array[start1++];
        }
        while (start2 <= right){
            temp[t++] = array[start2++];
        }

        //第三步:将temp数组复制到array数组中
        for (int i = left; i <=right; i++) {
            array[i] = temp[i];
        }
    }

 

posted @ 2020-07-18 15:39  _未知的暖意  阅读(120)  评论(0编辑  收藏  举报