zoukankan      html  css  js  c++  java
  • 归并排序算法图文详解(模版使用)

    算法介绍

    引用百度百科的介绍。

    归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

    算法描述

    归并排序,采用是分治法,先将数组分成子序列,让子序列有序,再将子序列间有序,合并成有序数组。

    算法描述:

    (1)把长度为n的输入序列分成长度 n/2的子序列;
    (2)对两个子序列采用归并排序;
    (3)合并所有子序列。

    算法实现

        void mergeSortInOrder(int[] arr,int bgn,int mid, int end){
            int l = bgn, m = mid +1, e = end;
            //相当于对一个数组的前半部分和后半部分进行排序排序,从开始的只有两个数,到后面
            //因为基本有序,所以只需要进行合并就行
            int[] arrs = new int[end - bgn + 1];
            int k = 0;
            //进行有序合并
            while(l <= mid && m <= e){
                if(arr[l] < arr[m]){
                    arrs[k++] = arr[l++];
                }else{
                    arrs[k++] = arr[m++];
                }
            }
            //如果前半部分大的比较多,直接接在后面
            while(l <= mid){
                arrs[k++] = arr[l++];
            }
            //如果后半部分大的比较多,直接接在后面
            while(m <= e){
                arrs[k++] = arr[m++];
            }
            //对我们原来的数组进行值的覆盖
            for(int i = 0; i < arrs.length; i++){
                arr[i + bgn] = arrs[i];
            }
        }
         void mergeSort(int[] arr, int bgn, int end){
            //如果开始指针大于结束指针,结束
            if(bgn >= end){
                return;
            }
            //通过分治将我们的数组分成多个小数组
            int mid = (bgn + end) >> 1;
            mergeSort(arr,bgn,mid);
            mergeSort(arr,mid + 1, end);
            //对我们的小数组进行排序
            mergeSortInOrder(arr,bgn,mid,end);
        }
    

    算法分析

    稳定排序

    外排序(需要消耗额外的内存)

    时间复杂度O(nlogn),空间复杂度为O(1)

  • 相关阅读:
    BZOJ3156 防御准备
    BZOJ1911 [APIO2010] 特别行动队
    BZOJ1096 [ZJOI2007] 仓库建设
    HDU
    斜率优化的各种板子
    HDU
    HDU
    HDU
    HDU
    HDU
  • 原文地址:https://www.cnblogs.com/CryFace/p/13706441.html
Copyright © 2011-2022 走看看