Input array:
5 0 4 1 4 1 5 0 0 2 3 3 3 

Splitter maintains an array section of smaller numbers
to the left, in blue, and a section of large numbers
to the right, in green. Unprocessed numbers in the middle are in red.

Enter split: bottom = 0, top= 13, split value= 5
5 0 4 1 4 1 5 0 0 2 3 3 3 
5 0 4 1 4 1 5 0 0 2 3 3 3 
Exit split: split at= 13

Enter split: bottom = 0, top= 12, split value= 3
3 0 4 1 4 1 5 0 0 2 3 3 
3 0 3 1 4 1 5 0 0 2 3 4 
3 0 3 1 3 1 5 0 0 2 4 4 
3 0 3 1 3 1 2 0 0 5 4 4 
3 0 3 1 3 1 2 0 0 5 4 4 
Exit split: split at= 9

Enter split: bottom = 0, top= 9, split value= 3
3 0 3 1 3 1 2 0 0 
3 0 3 1 3 1 2 0 0 
Exit split: split at= 9

Enter split: bottom = 0, top= 8, split value= 0
0 0 3 1 3 1 2 0 
0 0 0 1 3 1 2 3 
0 0 0 1 3 1 2 3 
Exit split: split at= 3

Enter split: bottom = 0, top= 3, split value= 0
0 0 0 
0 0 0 
Exit split: split at= 3

Enter split: bottom = 0, top= 2, split value= 0
0 0 
0 0 
Exit split: split at= 2

Enter split: bottom = 3, top= 8, split value= 1
1 3 1 2 3 
1 1 3 2 3 
1 1 3 2 3 
Exit split: split at= 5

Enter split: bottom = 3, top= 5, split value= 1
1 1 
1 1 
Exit split: split at= 5

Enter split: bottom = 5, top= 8, split value= 3
3 2 3 
3 2 3 
Exit split: split at= 8

Enter split: bottom = 5, top= 7, split value= 3
3 2 
3 2 
Exit split: split at= 7

Enter split: bottom = 9, top= 12, split value= 5
5 4 4 
5 4 4 
Exit split: split at= 12

Enter split: bottom = 9, top= 11, split value= 4
4 4 
4 4 
Exit split: split at= 11
Output array:
0 0 0 1 1 2 3 3 3 4 4 5 5