归并排序

  

public class Solution {
    /*
     * 将一个数组中的两个相邻有序区间合并成一个
     *
     * 参数说明:
     *     a -- 包含两个有序区间的数组
     *     start -- 第1个有序区间的起始地址。
     *     mid   -- 第1个有序区间的结束地址。也是第2个有序区间的起始地址。
     *     end   -- 第2个有序区间的结束地址。
     */

    public static void main(String [] args){
        int[] t = {18,7,8,6,33,2,9,1};
        mergSort(t,0,7);
        for (int i = 0;i<t.length;i++)
            System.out.print(t[i] + "\t");
    }

    public static void mergSort(int [] arr,int l,int r){
        if(l>=r) return;
        int mid = (l+r)/2;
        //递归二分 将数组分为  [左,中],(中,右]
        mergSort(arr,l,mid);
        mergSort(arr,mid+1,r);
        //归并排序
        int aux[] = new int[r-l+1]; //这里弄一个要处理的数组副本 长度是 R-L+1
        for (int i =l;i<=r ;i++)    //副本数组从 L 开始,所以与原数组存在一个 L 的偏移量
            aux[i-l] = arr[i];
        int i = l,j = mid+1;        //i记录左边元素的下标位置 j记录右边元素的下标位置
        for (int k =l;k <= r; k++){ //k记录 arr 的下标位置
            if(i >mid){//第一个数组用完,用第二个数组
                arr[k] = aux[j-l];
                j++;
            }else if(j >r){//第二个数组用完了,用第一个数组
arr[k] = aux[i-l]; i++; }else if(aux[i-l] < aux[j-l]){//比较两个数组的第一个数,谁小放谁,大的指针不变,直达他说最小的 arr[k] = aux[i-l]; i++; }else{ arr[k] = aux[j-l]; j++; } } } }

 

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

posted @ 2018-10-09 21:47  思考的胖头鱼  阅读(123)  评论(0编辑  收藏  举报