/* This program uses the merge algorithm to sort an array, given in the code
The program contains some concepts in C which were not covered in lectures.
I include it here for anyone interested ...
IT IS NOT PART OF THE COURSE!
However, I will provide some more detailed comments about the programming
which you can read to help you understand what's going on (hopefully).
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void merge( int *, int *, int *, int, int);
void sortmerge( int *, int );
#define KEYSIZE 16
main()
{
int i, key[] = { 4,3,1,67,55,8,0,4,-5,37,7,4,2,9,1,-1};
sortmerge(key, KEYSIZE);
printf("after a merge sort the array is \n");
for (i=0;i<KEYSIZE;i++)
printf("%d\n", key[i]);
}
void merge(int a[], int b[], int c[], int m, int n)
{
int i=0,j=0,k=0;
while (i<m && j<n)
if( a[i] < b[j] )
c[k++] = a[i++];
else
c[k++] = b[j++];
while( i<m )
c[k++] = a[i++];
while ( j<n )
c[k++]=b[j++];
}
void sortmerge( int key[], int n)
{
int j,k,m,*w;
for (m=1;m<n; m*=2)
;
if ( m!= n){
printf( "Error: array size isn't a multiple of 2 .. bye!\n");
exit(1);
}
w = calloc(n, sizeof(int) );
assert( w != NULL );
for ( k=1; k<n; k*=2){
for ( j=0; j<n-k; j+= 2*k)
merge( key+j, key+j+k, w+j, k,k);
for( j=0; j<n; ++j)
key[j] = w[j];
}
free(w);
}