#include<algorithm>
#include<iostream>



void inline bubble_sort_function (int* data, int N) {
  for(int i = N-1; i>0; --i)
    for(int j=0;j<i;++j)
      if(data[j]>data[j+1]) 
	std::swap(data[j],data[j+1]);
    
}


template<int N> inline void loop(int *data) {
  if(data[0]>data[1]) std::swap(data[0],data[1]);

  loop<N-1>(++data);
 
}

template<> inline void loop<0>(int *data) {};

template<int N>  inline void bubble_sort_template(int * data) {
  loop<N-1>(data);
  
  bubble_sort_template<N-1>(data);

}




template<>  inline void bubble_sort_template<2>(int * data) {
  loop<1>(data);
};


/*
main() {
  int a[7] = {10,0,5,0,2,4,1};
  bubble_sort_template<7>(a);
  std::cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" ";
  std::cout<<a[3]<<" "<<a[4]<<" "<<a[5]<<" ";
  std::cout<<a[6]<<std::endl;
}
*/



const int N=12;


void fill(int *data,int n,int *b) {
    for(int i=0;i<n;i++) 
      data[i]=b[i];
    //data[i]=random();
}


void f(int *a){};

main() {
  srandom(29);
  int b[N];
  int a[N] ;

  clock_t start = clock();

  for(int i=0;i<N;++i) {
    b[i]=random();
    //b[i]=i;
    //b[i]=N-i;
  }

  for(int i=0;i<100000000;i++) {
    fill(a,N,b);
    
  }

  clock_t stop1 = clock();
  
  double fill_time=(stop1-start)/(double)CLOCKS_PER_SEC;
  std::cout<<fill_time<<std::endl;
  start = clock();

  for(int i=0;i<100000000;i++) {
    fill(a,N,b);
    bubble_sort_function(a,N);
  }
    
  stop1 = clock();
  
  std::cout<<(stop1-start)/(double)CLOCKS_PER_SEC - fill_time<<std::endl;

  start = clock();

  for(int i=0;i<100000000;i++) {
    fill(a,N,b);      
    bubble_sort_template<N>(a);
  }
    
  stop1 = clock();
  
   std::cout<<(stop1-start)/(double)CLOCKS_PER_SEC - fill_time<<std::endl;

   for(int i=0;i<N;i++) 
     std::cout<<a[i]<<" ";
   std::cout<<std::endl;

}