#include <iostream>
#include <algorithm>


// Calculate mean. Works for both sorted and unsorted arrays. 
float CalcMean(const int array[] , int size){
    if ( size <= 0 ) return 0;
    int sum = 0;
    for (int i = 0; i < size; i++) sum += array[i];
    return (float)sum / size;
}


// Calculate median. Works for sorted arrays. 
float CalcMedian(const int array[], int size){
    if( size <= 0 ) return 0;

    if( size % 2 ) return (float)array[size/2];
    else return (float)(array[size/2] + array[size/2+1]) / 2;
}



// Calculate mode. Works for sorted arrays. 
int CalcMode(const int array[], int size){
   if( size <= 0) return 0;

   int frequency = 1;  // frequency of the current element 
   int max_frequency = 0; // frequency of the mode 
   int mode = array[0]; // start with the first element 

   for (int i=0; i < size -1; i++) {

      if (array[i] == array[i+1]) { 
         frequency++; 

         if(frequency > max_frequency) { 
            max_frequency = frequency; 
            mode = array[i]; 
         }

      }
      else frequency = 1; // reset the counter
   }

   return mode;
}



int main() 
{
   const int size = 9;
   int numbers[size] =  { 3, 2, 4, 5, 1, 1, 2, 2, 3 };
   
   std::sort( std::begin(numbers), std::end(numbers) );

   float mean   = CalcMean( numbers, size);
   float median = CalcMedian( numbers, size);
   float mode   = CalcMode( numbers, size);

   std::cout << "Mean   : " << mean << std::endl;
   std::cout << "Median : " << median << std::endl;
   std::cout << "Mode   : " << mode << std::endl;
    
   return 0;
}
