###### tags: `learning` `algorithm` `neopolitan` # ch 2-8 The step-by-step analysis of `mergesort2()` The sourec code https://github.com/york56/algo_practice/blob/master/ch2_8_debug.py ``` input = [123, 34, 189, 56, 150, 12, 9, 240] ``` ``` mergesort2 low = 0 ; high = 7 mid = 3 mergesort2 low = 0 ; high = 3 mid = 1 mergesort2 low = 0 ; high = 1 mid = 0 mergesort2 low = 0 ; high = 0 X mergesort2 low = 1 ; high = 1 X merge2 low = 0 ; mid = 0 ; high = 1 i = 0 ; j = 1 ; k = 0 hard-copy U = S[:] U = [123, 34, 189, 56, 150, 12, 9, 240] S = [123, 34, 189, 56, 150, 12, 9, 240] S[ i ] >= S[ j ] S[ 0 ] >= S[ 1 ] 123 >= 34 U[ k ] is replaced by S[ j ] U[ 0 ] is replaced by S[ 1 ] U = [34, 34, 189, 56, 150, 12, 9, 240] S = [123, 34, 189, 56, 150, 12, 9, 240] j = 2 > 1 = high The right is used up U[k:high+1] is replaced by S[i:mid+1] U[ 1 : 2 ] is replaced by S[ 0 : 1 ] [34] [123] U = [34, 123, 189, 56, 150, 12, 9, 240] S = [123, 34, 189, 56, 150, 12, 9, 240] Put U into S U = [34, 123, 189, 56, 150, 12, 9, 240] S = [34, 123, 189, 56, 150, 12, 9, 240] mergesort2 low = 2 ; high = 3 mid = 2 mergesort2 low = 2 ; high = 2 X mergesort2 low = 3 ; high = 3 X merge2 low = 2 ; mid = 2 ; high = 3 i = 2 ; j = 3 ; k = 2 hard-copy U = S[:] U = [34, 123, 189, 56, 150, 12, 9, 240] S = [34, 123, 189, 56, 150, 12, 9, 240] S[ i ] >= S[ j ] S[ 2 ] >= S[ 3 ] 189 >= 56 U[ k ] is replaced by S[ j ] U[ 2 ] is replaced by S[ 3 ] U = [34, 123, 56, 56, 150, 12, 9, 240] S = [34, 123, 189, 56, 150, 12, 9, 240] j = 4 > 3 = high The right is used up U[k:high+1] is replaced by S[i:mid+1] U[ 3 : 4 ] is replaced by S[ 2 : 3 ] [56] [189] U = [34, 123, 56, 189, 150, 12, 9, 240] S = [34, 123, 189, 56, 150, 12, 9, 240] Put U into S U = [34, 123, 56, 189, 150, 12, 9, 240] S = [34, 123, 56, 189, 150, 12, 9, 240] merge2 low = 0 ; mid = 1 ; high = 3 i = 0 ; j = 2 ; k = 0 hard-copy U = S[:] U = [34, 123, 56, 189, 150, 12, 9, 240] S = [34, 123, 56, 189, 150, 12, 9, 240] S[ i ] < S[ j ] S[ 0 ] < S[ 2 ] 34 < 56 U[ k ] is replaced by S[ i ] U[ 0 ] is replaced by S[ 0 ] U = [34, 123, 56, 189, 150, 12, 9, 240] S = [34, 123, 56, 189, 150, 12, 9, 240] S[ i ] >= S[ j ] S[ 1 ] >= S[ 2 ] 123 >= 56 U[ k ] is replaced by S[ j ] U[ 1 ] is replaced by S[ 2 ] U = [34, 56, 56, 189, 150, 12, 9, 240] S = [34, 123, 56, 189, 150, 12, 9, 240] S[ i ] < S[ j ] S[ 1 ] < S[ 3 ] 123 < 189 U[ k ] is replaced by S[ i ] U[ 2 ] is replaced by S[ 1 ] U = [34, 56, 123, 189, 150, 12, 9, 240] S = [34, 123, 56, 189, 150, 12, 9, 240] i = 2 > 1 = mid The left is used up U[k:high+1] is replaced by S[j:high+1] U[ 3 : 4 ] is replaced by S[ 3 : 4 ] [189] [189] U = [34, 56, 123, 189, 150, 12, 9, 240] S = [34, 123, 56, 189, 150, 12, 9, 240] Put U into S U = [34, 56, 123, 189, 150, 12, 9, 240] S = [34, 56, 123, 189, 150, 12, 9, 240] mergesort2 low = 4 ; high = 7 mid = 5 mergesort2 low = 4 ; high = 5 mid = 4 mergesort2 low = 4 ; high = 4 X mergesort2 low = 5 ; high = 5 X merge2 low = 4 ; mid = 4 ; high = 5 i = 4 ; j = 5 ; k = 4 hard-copy U = S[:] U = [34, 56, 123, 189, 150, 12, 9, 240] S = [34, 56, 123, 189, 150, 12, 9, 240] S[ i ] >= S[ j ] S[ 4 ] >= S[ 5 ] 150 >= 12 U[ k ] is replaced by S[ j ] U[ 4 ] is replaced by S[ 5 ] U = [34, 56, 123, 189, 12, 12, 9, 240] S = [34, 56, 123, 189, 150, 12, 9, 240] j = 6 > 5 = high The right is used up U[k:high+1] is replaced by S[i:mid+1] U[ 5 : 6 ] is replaced by S[ 4 : 5 ] [12] [150] U = [34, 56, 123, 189, 12, 150, 9, 240] S = [34, 56, 123, 189, 150, 12, 9, 240] Put U into S U = [34, 56, 123, 189, 12, 150, 9, 240] S = [34, 56, 123, 189, 12, 150, 9, 240] mergesort2 low = 6 ; high = 7 mid = 6 mergesort2 low = 6 ; high = 6 X mergesort2 low = 7 ; high = 7 X merge2 low = 6 ; mid = 6 ; high = 7 i = 6 ; j = 7 ; k = 6 hard-copy U = S[:] U = [34, 56, 123, 189, 12, 150, 9, 240] S = [34, 56, 123, 189, 12, 150, 9, 240] S[ i ] < S[ j ] S[ 6 ] < S[ 7 ] 9 < 240 U[ k ] is replaced by S[ i ] U[ 6 ] is replaced by S[ 6 ] U = [34, 56, 123, 189, 12, 150, 9, 240] S = [34, 56, 123, 189, 12, 150, 9, 240] i = 7 > 6 = mid The left is used up U[k:high+1] is replaced by S[j:high+1] U[ 7 : 8 ] is replaced by S[ 7 : 8 ] [240] [240] U = [34, 56, 123, 189, 12, 150, 9, 240] S = [34, 56, 123, 189, 12, 150, 9, 240] Put U into S U = [34, 56, 123, 189, 12, 150, 9, 240] S = [34, 56, 123, 189, 12, 150, 9, 240] merge2 low = 4 ; mid = 5 ; high = 7 i = 4 ; j = 6 ; k = 4 hard-copy U = S[:] U = [34, 56, 123, 189, 12, 150, 9, 240] S = [34, 56, 123, 189, 12, 150, 9, 240] S[ i ] >= S[ j ] S[ 4 ] >= S[ 6 ] 12 >= 9 U[ k ] is replaced by S[ j ] U[ 4 ] is replaced by S[ 6 ] U = [34, 56, 123, 189, 9, 150, 9, 240] S = [34, 56, 123, 189, 12, 150, 9, 240] S[ i ] < S[ j ] S[ 4 ] < S[ 7 ] 12 < 240 U[ k ] is replaced by S[ i ] U[ 5 ] is replaced by S[ 4 ] U = [34, 56, 123, 189, 9, 12, 9, 240] S = [34, 56, 123, 189, 12, 150, 9, 240] S[ i ] < S[ j ] S[ 5 ] < S[ 7 ] 150 < 240 U[ k ] is replaced by S[ i ] U[ 6 ] is replaced by S[ 5 ] U = [34, 56, 123, 189, 9, 12, 150, 240] S = [34, 56, 123, 189, 12, 150, 9, 240] i = 6 > 5 = mid The left is used up U[k:high+1] is replaced by S[j:high+1] U[ 7 : 8 ] is replaced by S[ 7 : 8 ] [240] [240] U = [34, 56, 123, 189, 9, 12, 150, 240] S = [34, 56, 123, 189, 12, 150, 9, 240] Put U into S U = [34, 56, 123, 189, 9, 12, 150, 240] S = [34, 56, 123, 189, 9, 12, 150, 240] merge2 low = 0 ; mid = 3 ; high = 7 i = 0 ; j = 4 ; k = 0 hard-copy U = S[:] U = [34, 56, 123, 189, 9, 12, 150, 240] S = [34, 56, 123, 189, 9, 12, 150, 240] S[ i ] >= S[ j ] S[ 0 ] >= S[ 4 ] 34 >= 9 U[ k ] is replaced by S[ j ] U[ 0 ] is replaced by S[ 4 ] U = [9, 56, 123, 189, 9, 12, 150, 240] S = [34, 56, 123, 189, 9, 12, 150, 240] S[ i ] >= S[ j ] S[ 0 ] >= S[ 5 ] 34 >= 12 U[ k ] is replaced by S[ j ] U[ 1 ] is replaced by S[ 5 ] U = [9, 12, 123, 189, 9, 12, 150, 240] S = [34, 56, 123, 189, 9, 12, 150, 240] S[ i ] < S[ j ] S[ 0 ] < S[ 6 ] 34 < 150 U[ k ] is replaced by S[ i ] U[ 2 ] is replaced by S[ 0 ] U = [9, 12, 34, 189, 9, 12, 150, 240] S = [34, 56, 123, 189, 9, 12, 150, 240] S[ i ] < S[ j ] S[ 1 ] < S[ 6 ] 56 < 150 U[ k ] is replaced by S[ i ] U[ 3 ] is replaced by S[ 1 ] U = [9, 12, 34, 56, 9, 12, 150, 240] S = [34, 56, 123, 189, 9, 12, 150, 240] S[ i ] < S[ j ] S[ 2 ] < S[ 6 ] 123 < 150 U[ k ] is replaced by S[ i ] U[ 4 ] is replaced by S[ 2 ] U = [9, 12, 34, 56, 123, 12, 150, 240] S = [34, 56, 123, 189, 9, 12, 150, 240] S[ i ] >= S[ j ] S[ 3 ] >= S[ 6 ] 189 >= 150 U[ k ] is replaced by S[ j ] U[ 5 ] is replaced by S[ 6 ] U = [9, 12, 34, 56, 123, 150, 150, 240] S = [34, 56, 123, 189, 9, 12, 150, 240] S[ i ] < S[ j ] S[ 3 ] < S[ 7 ] 189 < 240 U[ k ] is replaced by S[ i ] U[ 6 ] is replaced by S[ 3 ] U = [9, 12, 34, 56, 123, 150, 189, 240] S = [34, 56, 123, 189, 9, 12, 150, 240] i = 4 > 3 = mid The left is used up U[k:high+1] is replaced by S[j:high+1] U[ 7 : 8 ] is replaced by S[ 7 : 8 ] [240] [240] U = [9, 12, 34, 56, 123, 150, 189, 240] S = [34, 56, 123, 189, 9, 12, 150, 240] Put U into S U = [9, 12, 34, 56, 123, 150, 189, 240] S = [9, 12, 34, 56, 123, 150, 189, 240] ``` ``` output = [9, 12, 34, 56, 123, 150, 189, 240] ```