#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int* inputData(char *fileName,int *data,int length){
  FILE *fo;
  int i;
  char str[256];

  if((fo=fopen(fileName,"r"))==NULL){//リードモードでファイルを開く
    printf("Can't Open Input File.\n");
    exit(1);
  }
  i=0;
  while(fgets(str,256,fo)!=NULL){//ファイルからデータを読み込む
    data[i]=atoi(str);
    i++;
  }
  return data;
}

void merge(int *data,int left,int right,int size){
  int tmp[256], h, i, j, k, l;
  
  i=left;
  j=right;
  k=left;
  l=left+size;

  while((i<right)&&(j<l)){
    if(data[i]<data[j]){
      tmp[k]=data[i];
      i++;
    }
    else{
      tmp[k]=data[j];
      j++;
    }
    k++;
  }
  if(i<right){
    for(h=i;h<right;h++){
      tmp[k]=data[h];
      k++;
    }
  }
  if(j<l){
    for(h=j;h<l;h++){
      tmp[k]=data[h];
      k++;
    }
  }
  for(h=left;h<l;h++){
    data[h]=tmp[h];
  }
}

void merge_sort(int *data,int left,int right){
  int middle;//分割する基準

  if(left<right){
    middle=(right+left)/2;
    merge_sort(data,left,middle);
    merge_sort(data,middle+1,right);
    merge(data,left,middle+1,right-left+1);
  }
}

void outputData(int *data,int length){
  int i;

  //結果を標準出力
  printf("\n*****Result*****\n");
  for(i=0;i<length;i++){
    printf("%d ",data[i]);
  }
  printf("\n");
}

int main(int argc,char *argv[]){
  int length,i;
  int *data;
  
  if(argc!=3){
    printf("Please Enter Length and File Name\n");
    exit(1);
  }
  if(!isdigit(*argv[1])){
    printf("Length is Integer!!!\n");
    exit(1);
  }
  length=atoi(argv[1]);
   
  //int型配列を用意する
  data=(int*)malloc(sizeof(int)*length);

  data=inputData(argv[2],data,length);
   
  printf("***DATA***\n");
  for(i=0;i<length;i++){
    printf("%d ",data[i]);
  }
  printf("\n");
  merge_sort(data,0,length-1);
  outputData(data,length);
  free(data);
  return(0);
}
