Data Structures and Algorithms/InsertionSortMiddle

Description
How it work? InsertionSortMiddle work as insert sort. Get next value (i+1) and insert to sorted array. Check possition from middle of sorted array, then middle of part...

Properties: Algoritm not need extra memory. Ist slow for large array (moving a large array takes a lot of time). Have minimal comparation operations of all know algorithms (without counting sorts). Stable.

Statistics from real code execution (average)
n        = 1.024 value-min = 0 value-max = n/2    // 50% of array contain some repeating value -- compares ~ 8.825    (Tim-sort ~8.961) cycles   ~ 273.362  (Tim-sort ~16.097) moves    ~ 263.514  (Tim-sort ~13.659, Select-sort ~3.054) stability = stable

Schematic of work
 3 1 2 2 0 3 1 0   // input

3                 // is first sorted array, (left = 0), half = 0, mid = 0 + floor(half / 2) (first pos_b),  cmp = 0  . 1               // next i = 1, value = array[i] = 1, mid = 0 3-1               // compare 3-1 1 3               // 13 is now output, half = i, mid = 0 + floor(half / 2),  cmp + 1  . .  2              // next i, array[i], mid = 0 1---2             // compare(array[i], array[mid]), compare>=0, half = floor(half / 2), left = mid, mid = left + half 3-2             // compare(array[i], array[mid]), compare<0, end (because half = 0, cannot more divide), half = i, mid = 0 + round(half / 2),  cmp + 2  1 2 3 .                // ... note: for simplify, i remove lot of repeating text 2           // next i, mid = 1 2---2           // compare>=0, mid = left + half . 3-2           // compare<0, end,  cmp + 2  1 2 2 3 .  .     0          // next i, mid = 1 2-0         // compare<0, mid = left - half 1---0         // compare<0, end,  cmp + 2  0 1 2 2 3   .          3        // next i, mid = 2 2-3       // compare>=0, mid = left + half . 2---3       // compare>=0, mid = left + half .  3-3        // compare>=0, end,  cmp + 3  0 1 2 2 3 3   .    .       1      // next i, mid = 2 2---1     // compare<0, mid = left - half 1-1     // compare>=0, end,  cmp + 2  (my alg. code here compute cmp+3, because compare zero) 0 1 1 2 2 3 3     .              0    // next i, mid = 3 2---0   // compare<0, mid = left - half 1---0   // compare<0, mid = left - half 0-0   // compare>=0, end,  cmp + 3 

=
== 0 0 1 1 2 2 3 3   // output, suma(cmp) = 1+2+2+2+3+2+3 = 15