算法之自底向上的归并排序

  • 基本概念

之前使用自顶向下的归并排序,我们的主要思想是将一个大问题分成一个小问题,通过解决一个一个小问题来最终完成大问题。既然我们可以通过化整为零的方式Coding,那么是不是也可以由简入繁,由下到上?
仔细一想,我们可以先归并小数组,在成对的归并得到的较小数组,通过不断往复循环,归并大的数组。简单来说,就是两两归并,四四归并,八八归并

  • 代码实现
public class MergeSort {
    private int[] temp;//初始化一个排序要用的副数组
    public static void mergeSort(int[] arr) {
        int L = arr.length;//得到参数数组长度L
        temp = new int[L];//定义数组长度

        for(int x=1; x<L; x = x+x){//定义微型数组的长度,初始为1
            for(int y =0; y <L-x; y += x+x) {//定义微型数组的索引
                merge(a,temp,0,y+x-1,Math.min(y+x+x-1, L-1);
                }
            }
        }

    public static void merge(int[] arr,int[] temp,int min,int mid,int max) {
        int i = min;
        int j = mid + 1;

        for(int x=min;x<=max;x++) {
            temp[x]=arr[x];
            }

        for(int x=min;x<=max;x++){
            if(i>mid) {
                arr[x] = temp[j++];
                }else if(j>max) {
                arr[x] = temp[i++];
                }else if(temp[i]>temp[j]){
                arr[x]=temp[j++];
                }else {
                arr[x] = temp[i++];
                }
            }
        }
    }



点赞