Skip to content

Instantly share code, notes, and snippets.

@toughrogrammer
Last active December 18, 2015 03:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save toughrogrammer/5721102 to your computer and use it in GitHub Desktop.
Save toughrogrammer/5721102 to your computer and use it in GitHub Desktop.
Is it mergesort algorithm?
void init( int arr[], int size, int value )
{
int i;
for( i=0; i<size; i++ )
arr[i] = value;
}
void merge( int arr[], int leftstart, int leftend, int rightstart, int rightend )
{
int* tmp = new int[ rightend - leftstart + 1];
init( tmp, rightend - leftstart + 1, 0 );
int i = leftstart;
int j = rightstart;
int cnt = 0;
while( i <= leftend && j <= rightend )
{
if( arr[i] > arr[j] )
tmp[cnt++] = arr[i++];
else
tmp[cnt++] = arr[j++];
}
while( i <= leftend )
tmp[cnt++] = arr[i++];
while( j <= rightend )
tmp[cnt++] = arr[j++];
int k;
int cnt2 = 0;
for( k = leftstart; k <= rightend; k++ )
arr[k] = tmp[cnt2++];
delete[] tmp;
}
void mergesort( int arr[], int left, int right )
{
if( left >= right )
return;
int mid = ( left + right ) / 2;
mergesort( arr, left, mid );
mergesort( arr, mid+1, right );
merge( arr, left, mid, mid+1, right );
}
void mergesort_without_recursion( int arr[], int left, int right )
{
int step = 2;
int i = 1;
int length = right - left + 1;
int tmp;
int l = left, r;
while( l < right )
{
merge( arr, l, l, l+1, l+1 );
l+=2;
}
for( step = 2; step < length; step *= 2 )
{
l = left;
r = l + step;
merge( arr, l, l+step-1, r, r+step-1 );
while( 1 )
{
l += step*2;
r = l + step;
if( r > right )
break;
merge( arr, l, l+step-1, r, r+step-1 );
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment