#include<iostream.h>
#include<fstream.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>

int array1[500],array2[1000],array3[1500],array4[2000],array5[2500],array6[3000],n,number;

int i,j,temp,minindex,counter;

//sort function
void selection(int b[],int n)
{

  for( i=0;i<n-1;i++)
   {
       minindex=i;

  for( j=i+1;j<n;j++)
   {
       if(b[i]>b[j])
       {
    	minindex=j;
    	temp=b[i];
    	b[i]=b[minindex];
    	b[minindex]=temp;
   }
  }
}
}


 void exchang(int b[],int n)
{
  for(i=0;i<=n;i++)
	for(j=i+1;j<n;j++)
	{
	 if(b[i]>b[j])
	{
	temp=b[i];
	b[i]=b[j];
	b[j]=temp;

	 }
	}
 }



 void insertion(int b[],int n)
{
	for(i=1;i<n;i++)
	{
	  j=i;
	  temp=b[i];
	while(j>0&&temp<b[j-1])
	{
		b[j]=b[j-1];
		 j--;
	}
		b[j]=temp;
	}
}


void qsort(int list[],int frist,int last)
{
	int pivot,up,down,mid;
	mid=(frist+last)/2;
	pivot=list[mid];
	int temp=list[frist];
	list[frist]=list[mid];
	list[mid]=temp;
	up=frist+1;
	down=last;
	do
	{

 while((up <=down) && (list[up] <= pivot))
		 up++;

 while(pivot<list[down])
	 down--;

     if(up<down)
    {
    
      temp=list[up];
      list[up]=list[down];
      list[down]=temp;
    }

}while(up<down);

list[frist]=list[down];
list[down]=pivot;

    if(frist<down-1)
    {
    
    qsort(list,frist,down-1);
    }

    if(down+1<last)
    {
    qsort( list,down+1,last);
    }

}




 main(int argc,char*argv[])

{

	if(argc!=5)
	{
	cout<<"uncorrect arguments."
	<<endl<<"\tusage."
	<<endl<<"\t<program name><file name>.";
	return 0;
	}

	n=atoi(argv[4]);
	int i=0;
	//open file 
	ifstream my_file(argv[1]);
	char *op=argv[3];
	if(!my_file)
	{
	cout<<"\n error in opening file.check directory and file_name.\n";
	return 0;
	}

	 ofstream e;
//test to size of the file
 switch(n)
	{
		case 500:
 //read from file
	while(my_file)
	{
	my_file>>number;
	array1[i]=number;
	 i++;
	}
	my_file.close();

 //test to sort type

  switch(*op)
	{

		case 's':
		{

	 selection(array1,i);
 //open new file to write
	e.open(argv[2] ,ios::out);
	for(int j=0;j<i;j++)
	e<<array1[j]<<"\n";
		e.close();
	 }
		break;

	case 'q':
	{


	qsort(array1,0,i-1);
	//open new file to write
	e.open(argv[2],ios::out);
	for(j=0;j<i;j++)
	e<<array1[j]<<"\n";
	e.close();
	}
	break;


	case 'i':
		 {
	  insertion(array1,i);
		//open new file to write
	  e.open(argv[2],ios::out);
		for(j=0;j<i;j++)
		e<<array1[j]<<"\n";
		e.close();
			}
		  break;

		case 'e':
		 {
		 exchang(array1,i);
		  //open new file to write
		e.open(argv[2],ios::out);
		for( j=0;j<i;j++)
		e<<array1[j]<<"\n";
		e.close();
		 }
		 break;
	  }
	  break;



	  case 1000:

	while(my_file)
	{
	my_file>>number;
	array2[i]=number;
	 i++;
	}
	my_file.close();

 //test to sort type
  switch(*op)
	{

		case 's':
		{

	 selection(array2,i);
	//open new file to write
	e.open(argv[2] ,ios::out);
	for(int j=0;j<i;j++)
	e<<array2[j]<<"\n";
	e.close();
	 }
		break;

	case 'q':
	  {
	qsort(array2,0,i-1);
	//open new file to write
	e.open(argv[2],ios::out);
	for(j=0;j<i;j++)
	e<<array2[j]<<"\n";
	e.close();
		}
	break;


	case 'i':
		 {
	  insertion(array2,i);
		//open new file to write
	  e.open(argv[2],ios::out);
		for(j=0;j<i;j++)
		e<<array2[j]<<"\n";
		e.close();
		  }
		  break;

		case 'e':
			{
		 exchang(array2,i);
		  //open new file to write
		e.open(argv[2],ios::out);
		for( j=0;j<i;j++)
		e<<array2[j]<<"\n";
		e.close();
			 }
		 }

		break;


	case 1500:

	while(my_file)
	{
	my_file>>number;
	array3[i]=number;
	 i++;
	}
	my_file.close();

 //test to sort type
  switch(*op)
	{

		case 's':
		 {
	  selection(array3,i);
	 //open new file to write
	e.open(argv[2] ,ios::out);
	for(int j=0;j<i;j++)
	e<<array3[j]<<"\n";
	e.close();
		  }
	 break;

	case 'q':
		{
	qsort(array3,0,i-1);
	//open new file to write
	e.open(argv[2],ios::out);
	for(j=0;j<i;j++)
	e<<array3[j]<<"\n";
	e.close();
		 }
	break;


	case 'i':
		  {
	  insertion(array3,i);
		//open new file to write
	  e.open(argv[2],ios::out);
		for(j=0;j<i;j++)
		e<<array3[j]<<"\n";
		e.close();
			 }
		  break;

		case 'e':
		  {
		 exchang(array3,i);
		 //open new file to write
		e.open(argv[2],ios::out);
		for( j=0;j<i;j++)
		e<<array3[j]<<"\n";
		e.close();
			}
		 break;
		}
		break;


		case 2000:

	while(my_file)
	{
	my_file>>number;
	array4[i]=number;
	 i++;
	}
	my_file.close();


//test to sort type

  switch(*op)
	{

		case 's':

		  {
	 selection(array4,i);
	 //open new file to write
	e.open(argv[2] ,ios::out);
	for(int j=0;j<i;j++)
	e<<array4[j]<<"\n";
	e.close();
		}
		break;

	case 'q':
	 {
	 qsort(array4,0,i-1);
	 //open new file to write
	e.open(argv[2],ios::out);
	for(j=0;j<i;j++)
	e<<array4[j]<<"\n";
	e.close();
	  }
	break;


	case 'i':
		{
	  insertion(array4,i);
	  //open new file to write
	  e.open(argv[2],ios::out);
		for(j=0;j<i;j++)
		e<<array4[j]<<"\n";
		e.close();
		 }
		  break;

		case 'e':
		  {
		 exchang(array4,i);
		 //open new file to write
		e.open(argv[2],ios::out);
		for( j=0;j<i;j++)
		e<<array4[j]<<"\n";
		e.close();
			}
		 break;
		}
		break;


	 case 2500:

	while(my_file)
	{
	my_file>>number;
	array5[i]=number;
	 i++;
	}
	my_file.close();


   //test to sort type

  switch(*op)
	{

		case 's':
		{

	 selection(array5,i);
	 //open new file to write
	e.open(argv[2] ,ios::out);
	for(int j=0;j<i;j++)
	e<<array5[j]<<"\n";
	e.close();
		 }
		break;

	case 'q':
		  {
	 qsort(array5,0,i-1);
	 //open new file to write
	e.open(argv[2],ios::out);
	for(j=0;j<i;j++)
	e<<array5[j]<<"\n";
	e.close();
			}
	break;


	case 'i':
			 {
	  insertion(array5,i);
	  //open new file to write
	  e.open(argv[2],ios::out);
		for(j=0;j<i;j++)
		e<<array5[j]<<"\n";
		e.close();
			  }
		  break;

		case 'e':
			 {
		 exchang(array5,i);
		 //open new file to write
		e.open(argv[2],ios::out);
		for( j=0;j<i;j++)
		e<<array5[j]<<"\n";
		e.close();
			  }
		 break;
		}
		break;

		case 3000:

	while(my_file)
	{
	my_file>>number;
	array6[i]=number;
	 i++;
	}
	my_file.close();

//test to sort type
  switch(*op)
	{

		case 's':
		  {
	 selection(array6,i);
	//open new file to write
	e.open(argv[2] ,ios::out);
	for(int j=0;j<i;j++)
	e<<array6[j]<<"\n";
	e.close();
	 }
		break;

	case 'q':
	 {
	qsort(array6,0,i-1);
	//open new file to write
	e.open(argv[2],ios::out);
	for(j=0;j<i;j++)
	e<<array6[j]<<"\n";
	e.close();
	  }
	break;


	case 'i':
		{
	  insertion(array6,i);
		//open new file to write
	  e.open(argv[2],ios::out);
		for(j=0;j<i;j++)
		e<<array6[j]<<"\n";
		e.close();
		 }
		  break;

		case 'e':
		  {
		 exchang(array6,i);
		//open new file to write
		e.open(argv[2],ios::out);
		for( j=0;j<i;j++)
		e<<array6[j]<<"\n";
		e.close();
		}
		 break;
		} //end switch for sort type

	} //end switch for size of the file
	 return 0;
}
