Understanding the Recursion of mergesort

后端 未结 9 2048
感动是毒
感动是毒 2020-12-13 07:01

Most of the mergesort implementations I see are similar to this. intro to algorithms book along with online implentations I search for. My recursion chops don\'t go much fur

9条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-13 07:31

    I think the "sort" function name in MergeSort is a bit of a misnomer, it should really be called "divide".

    Here is a visualization of the algorithm in process.

    enter image description here

    Each time the function recurses, it's working on a smaller and smaller subdivision of the input array, starting with the left half of it. Each time the function returns from recursion, it will continue on and either start working on the right half, or recurse up again and work on a larger half.

    Like this

    [************************]mergesort
    [************]mergesort(lo,mid)
    [******]mergesort(lo,mid)
    [***]mergesort(lo,mid)
    [**]mergesort(lo,mid)
     [**]mergesort(mid+1,hi)
    [***]merge
       [***]mergesort(mid+1,hi)
       [**]mergesort*(lo,mid)
        [**]mergesort(mid+1,hi)
       [***]merge
    [******]merge
          [******]mergesort(mid+1,hi)
          [***]mergesort(lo,mid)
          [**]mergesort(lo,mid)
           [**]mergesort(mid+1,hi)
          [***]merge
             [***]mergesort(mid+1,hi)
             [**]mergesort(lo,mid)
               [**]mergesort(mid+1,hi)
             [***]merge
          [******]merge
    [************]merge
                [************]mergesort(mid+1,hi)
                [******]mergesort(lo,mid)
                [***]mergesort(lo,mid)
                [**]mergesort(lo,mid)
                 [**]mergesort(mid+1,hi)
                [***]merge
                   [***]mergesort(mid+1,hi)
                   [**]mergesort(lo,mid)
                     [**]mergesort(mid+1,hi)
                   [***]merge
                [******]merge
                      [******]mergesort(mid+1,hi)
                      [***]mergesort(lo,mid)
                      [**]mergesort*(lo,mid)
                        [**]mergesort(mid+1,hi)
                      [***]merge
                         [***]mergesort(mid+1,hi)    
                         [**]mergesort(lo,mid)
                          [**]mergesort(mid+1,hi)
                         [***]merge
                      [******]merge
                [************]merge
    [************************]merge
    

提交回复
热议问题