阴阳大论之归并算法

阴阳大论之归并算法

目录

## 归并算法

定义

归并排序是基于分治的递归算法。类似前两篇博客所说的mapReduce思想和fork/Join框架。将原数组不断的分为两个大小相同的子数组,直到子数组的元素长度为1;然后将子数组进行排序; 再将排序后的结果进行合并

公式

归并排序的递归公式:T(N) = 2T(N/2) + O(N)

算法复杂度

时间复杂度:O(nlogn)
空间复杂度:O(n)。用到了一个临时数组,故空间复杂度为O(N)

算法步骤

  1. 分解 -- 将当前区间一分为二,即求分裂点 mid = (low + high)/2;
  2. 求解 -- 递归地对两个子区间a[low...mid] 和 a[mid+1...high]进行归并排序。递归的终结条件是子区间长度为1。
  3. 合并 -- 将已排序的两个子区间a[low...mid]和 a[mid+1...high]归并为一个有序的区间a[low...high]。

应用场景

  • java.util.Arrays.sort(T[] arr)使用的是归并排序
  • java.util.Arrays.sort(int[] arr) 使用的是快速排序
  • JDK7中使用 TimSort算法取代了原来的归并排序。优化点:①归并排序中的“分”不再直至划分到单个元素;②引入binarySort二分查找思想。

源码

/**
 * 归并算法
 *
 * @author 石玉森
 * @create 2019-03-12 11:52
 **/

public class MergeSortDemo {
    public static void main(String[] args) {
        int []data  = new int[8];
        for(int i= 0;i<data.length ;i++){
            data[i] = RandomUtils.nextInt(0,50);
        }
        //归并排序
        mergeSort(data ,0 ,data.length-1);
        for(int i = 0;i<data.length ;i++){
            System.out.print(data[i]+" ");
        }
    }
    //归并排序
    public static int[] mergeSort(int[] data,int low,int high){
        int mid = (low+high)/2;
        if(low<high){
            mergeSort(data,low,mid);
            mergeSort(data,mid+1,high);
            //左右归并
            merge(data,low,mid,high);
        }
        return data;
    }

    //归并排序的辅助方法
    public static void merge(int[] data, int low, int mid, int high) {
        int[] temp = new int[high-low+1];
        int i = low;
        int j = mid+1;
        int k = 0;
        // 把较小的数先移到新数组中
        while(i<=mid && j<=high){
            if(data[i]<data[j]){
                temp[k++] = data[i++];
            }else{
                temp[k++] = data[j++];
            }
        }
        // 把左边剩余的数移入数组
        while(i<=mid){
            temp[k++] = data[i++];
        }
        // 把右边边剩余的数移入数组
        while(j<=high){
            temp[k++] = data[j++];
        }
        //将排好序的序列,重存回到 list 中 low 到 high 区
        for(int x=0;x<temp.length;x++){
            data[x+low] = temp[x];
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/shiyusen/p/10533641.html