#include <iostream>
#include <cstdlib>
#include <ctime>
#include <boost/chrono.hpp>

#include "row.cpp"

using namespace std;

int main(){

boost::chrono::high_resolution_clock::time_point start;
boost::chrono::high_resolution_clock::time_point stop;
boost::chrono::microseconds ms;

srand((unsigned)time(nullptr));

double* b = new double[1000];
for(int i=0; i<1000; i++){
	b[i] = (double)rand()/ RAND_MAX *20000.0 -10000.0;
}
//=============================================DOUBLE KANTA REEEEEIIIII

row<double>* a1 = new row<double>(b, 1000);
row<double>* a2 = new row<double>(b, 1000);
row<double>* a3 = new row<double>(b, 1000);
row<double>* a4 = new row<double>(b, 1000);
row<double>* a5 = new row<double>(b, 1000);
row<double>* a6 = new row<double>(b, 1000);

cout << "For n=1000: \n";


//Start Quick Timer
start= boost::chrono::high_resolution_clock::now();
quick_sort(*a1);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Quick Time= "<<ms.count()<<endl;

//Start Bubble Timer
start= boost::chrono::high_resolution_clock::now();
bubble_sort(*a2);
//cout << "Bubble: " << *a << "\n";
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Bubble Time= "<<ms.count()<<endl;

//Start Merge Timer
start= boost::chrono::high_resolution_clock::now();
merge_sort_recursive(*a3);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Merge Time= "<<ms.count()<<endl;

//Start Selection Timer
start= boost::chrono::high_resolution_clock::now();
selection_sort(*a4);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Selection Time= "<<ms.count()<<endl;

//Start Insertion Timer
start= boost::chrono::high_resolution_clock::now();
insertion_sort(*a5);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);

cout<<"Insertion Time= "<<ms.count()<<endl;

//Start Enumeration Timer
start= boost::chrono::high_resolution_clock::now();
enumeration_sort(*a6);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Enumeration Time= "<<ms.count()<<endl;

/*
//Start Quick Timer
start= boost::chrono::high_resolution_clock::now();
quick_sort(*a3);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Quick Time= "<<ms.count()<<endl;
*/
delete a1;
delete a2;
delete a3;
delete a4;
delete a5;
delete a6;
delete[] b;


cout<<"For n=10000: \n";


b = new double[10000];
for(int i=0; i<10000; i++){
	b[i] = (double)rand()/ RAND_MAX *20000.0 -10000.0;
}



a1 = new row<double>(b, 10000);
a2 = new row<double>(b, 10000);
a3 = new row<double>(b, 10000);
a4 = new row<double>(b, 10000);
a5 = new row<double>(b, 10000);
a6 = new row<double>(b, 10000);

//Start Quick Timer
start= boost::chrono::high_resolution_clock::now();
quick_sort(*a1);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Quick Time= "<<ms.count()<<endl;

//Start Bubble Timer
start= boost::chrono::high_resolution_clock::now();
bubble_sort(*a2);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Bubble Time= "<<ms.count()<<endl;

//Start Merge Timer
start= boost::chrono::high_resolution_clock::now();
merge_sort_recursive(*a3);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Merge Time= "<<ms.count()<<endl;

//Start Selection Timer
start= boost::chrono::high_resolution_clock::now();
selection_sort(*a4);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Selection Time= "<<ms.count()<<endl;

//Start Insertion Timer
start= boost::chrono::high_resolution_clock::now();
insertion_sort(*a5);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Insertion Time= "<<ms.count()<<endl;

//Start Enumeration Timer
start= boost::chrono::high_resolution_clock::now();
enumeration_sort(*a6);
stop= boost::chrono::high_resolution_clock::now();
ms= boost::chrono::duration_cast<boost::chrono::microseconds>(stop-start);
cout<<"Enumeration Time= "<<ms.count()<<endl;


delete a1;
delete a2;
delete a3;
delete a4;
delete a5;
delete a6;
delete[] b;






return 0;
}
