#include <stdio.h>

void mergesort(int a[], int, int);
void insertion(int a[], int);

int main (int argc, char *argv[]) {

    FILE *infile;
    char unsorted_file[15];
    int i = 0, number, data[2000];

    if (argc != 2) {
	printf("Error entering correct number of arguements.\n");
        printf("Enter the name of the unsorted file. ");
        scanf("%s", unsorted_file);
    } else
	strcpy (unsorted_file, argv[1]);

    /* open file */
    if ((infile = fopen(unsorted_file, "r")) == NULL) {
	printf("Error opening file: %s.\n", unsorted_file);
	exit(1);
    }

    /* read unsorted file */
    while (fscanf(infile, "%d", &number) != EOF) {
	data[i] = number;
	i++;
    }

    /* sort part of the list */
    mergesort(data, 0, i-1);

    /* use insertion sort to finish the sort */
    insertion(data, i);

    /* print some of the list */
    for (i = 0; i < 500; i++)
	printf("%d\n", data[i]);

    fclose(infile); 
         
    printf("Done!!\n");
    exit();

}

void mergesort(int a[], int l, int r) {

    int i, j, k, m;
    int b[1000];

    if (r-l > 10) {
	m = (r+l)/2;
	mergesort(a, l, m);
	mergesort(a, m+1, r);
	for (i = m+1; i > l; i--)
	    b[i-1] = a[i-1];
	for (j = m; j < r; j++)
	    b[r+m-j] = a[j+1];
	for (k = l; k <= r; k++)
	    a[k] = (b[i] < b[j]) ? b[i++] : b[j--];
    }

}

void insertion(int a[], int n) {
         
    int i, j = 0, v, k;

    for (i=1; i<n; i++) {
	v = a[i];
	j = i;
	while (a[j-1] > v) {
	    a[j] = a[j-1];
	    j--;
	}
	a[j]=v;
    }

}

