#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <math.h>
#define NUM_TO_CALC 33
int insertSort(int *A, int m)
{
for(int i = 1; i < m; i++)
{
int key = A[i];
for(int j = i -1; j >= 0; j--)
{
if(A[j] > key)
{
A[j+1] = A[j];
A[j] = key;
}
}
}
return 0;
}
int insertSortRecursion(int *A, int m)
{
if( m <= 1) return 0;
insertSortRecursion(A, m - 1);
int key = A[m-1];
for(int j = m - 1; j >= 0; j--)
{
if(A[j] > key)
{
A[j+1] = A[j];
A[j] = key;
}
}
return 0;
}
enum{
LEFT_B = 0,
RIGHT_B,
};
int insertSortRecursionBinary(int *A, int m)
{
if( m <= 1) return 0;
insertSortRecursion(A, m - 1);
int key = A[m-1];
int logInt = log10(m)/log10(2) + 1;
int baseIndex = 0;
int leftRight = RIGHT_B;
for(int j = 0; j < logInt; j++)
{
if(leftRight == RIGHT_B)
{
baseIndex += int(m/pow(2,j+1));
}
else
{
baseIndex -= int(m/pow(2,j+1));
}
if(A[baseIndex] == key)
{
break;
}
else if(A[baseIndex] < key)
{
leftRight = RIGHT_B;
}
else if(A[baseIndex] > key)
{
leftRight = LEFT_B;
}
}
printf(" %s(%d)%d, %d, key %d\n", __FILE__, __LINE__, m, baseIndex, key);
for(int j = m - 2; j > baseIndex; j--)
{
if(A[j] > key)
{
A[j+1] = A[j];
A[j] = key;
}
}
return 0;
}
int main()
{
int A[NUM_TO_CALC];
for(int i = 0; i < NUM_TO_CALC; i++)
{
int randTmp = rand();
A[i] = randTmp%NUM_TO_CALC;
}
for(int i = 0; i < NUM_TO_CALC; i++)
{
printf("%d ", A[i]);
}
printf("\n*******************\n");
// insertSort(A, 23);
// insertSortRecursion(A, NUM_TO_CALC);
insertSortRecursionBinary(A, NUM_TO_CALC);
for(int i = 0; i < NUM_TO_CALC; i++)
{
printf("%d ", A[i]);
}
printf("\n*******************\n");
return 0;
}