归并算法

1. 归并算法的思路

将想要排序的序列不断拆分,直至变为不能拆分的个体为止,将序列以对半分割的形式分成两段,再将其子序列再对半分割的形式分成两段。
时间复杂度为O(nlogn)。

拆分过后,再排序组合的时候,两两比较,选出两组数据的首位进行比较,依次比较,存入新的序列当中,以此类推,如图:

先比较3和4


在比较6和7

2,代码实现

package com.baidu.ueditor;

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] arr = {8,4,5,7,1,3,6,2};
        int[] newarr = new int[arr.length];
        chaifen(arr , 0 , arr.length-1 , newarr);
    }

    //拆分序列,只需要拆分索引就可以
    public static void chaifen(int[] arr , int left , int right ,int[] newarr){
        //求中间的索引
        int between = (left + right) / 2;
        if(left < right) {
            //右边的索引
            chaifen(arr, left, between,newarr);
            //左边的索引
            chaifen(arr, (between + 1), right,newarr);
            hebin(arr , left , between , right , newarr);
            System.out.println(" 最左边索引:"+left+"\t最右边边索引:"+right+"\t"+ Arrays.toString(arr));
            System.out.println("每次的排序结果"+Arrays.toString(arr));
        }
    }

    public static void hebin(int[] arr , int left , int between ,  int right , int[] newarr){
        int i = left;  //初始i,左边有序序列的初始索引
        int j = between+1;  //初始j,右边有序序列的初始索引
        int t = 0;       //指向temp数组的当前索引
        //1.
        //先把左右两边(有序)的数据按照规则填充到temp数组
        //直到左右两边的有序序列,有一边处理完毕为止
        while(i <= between && j <= right) {
            if(arr[i]<arr[j]) {
                newarr[t]=arr[i];
                i++;
            }
            else {
                newarr[t]=arr[j++];
            }
            //因为无论执行if里面的语句还是else里面的语句,t都要加1,所以把t移出来.
            t++;
        }
        //2.
        //把有剩余数据的一边的的数据依次全部填充到temp,因为数据有可能出现单数的情况,剩下的单数都是最大的一个
        //由上述循环条件:i<=mid&&j<=right 可知
        //此时要么i>mid 要么j>right
        while(i<=between) {
            newarr[t]=arr[i];
            t++;
            i++;
        }

        while(j<=right) {
            newarr[t]=arr[j];
            t++;
            j++;
        }

        //3.
        //把temp的数组转移到arr上,实现每分隔一次,就组合一遍
        int n=0;
        int tempLeft=left;
        while(tempLeft<=right){
            arr[tempLeft]=newarr[n];
            n++;
            tempLeft++;
        }
    }
}
posted @ 2024-02-20 14:34  Hello-!World  阅读(50)  评论(0)    收藏  举报