All pastes #718974 Raw Edit

Untitled

public text v1 · immutable
#718974 ·published 2007-09-28 20:58 UTC
rendered paste body
#ifndef _SORT_BLADEZOR_H_
#define _SORT_BLADEZOR_H_

#include <iostream>

//
//	Title: Bladezor's extremely overcomplicated sort algorithm. 
//
//	Description: I combined various algorithms together such as quick sort and heap sort to come up
//				 with something smart and fast. It's relatively good at handling quick-sort killers.
//

const int MAX_DEPTH = 1000;
bool IsSorted = false;

void swapIndices( int *x, int *y )
{
	int temp = *x;
	*x = *y;
	*y = temp;
}

bool isIncreasing( int *data, int length )
{
	for( int i = 0; i < length; i++ )
	{
		if( i + 1 < length )
		{
			if( *(data + i) == *(data + i + 1) )
			{
				return false;
			}
		}

		if( *(data + i) < *(data) )
		{
			return false;
		}
	}

	return true;
}

bool isDecreasing( int *data, int length )
{
	for( int i = 0; i < length; i++ )
	{	
		if( i+1 < length )
		{
			if( *(data +i ) == *(data + i + 1) )
			{
				return false;
			}
		}

		if( *(data + i) > *(data) )
		{
			return false;
		}
	}

	return true;
}

bool isSame( int *data, int length )
{
	for( int i = 1; i < length; i++ )
	{
		if( *(data + i) != *(data) )
		{
			return false;
		}
	}

	return true;
}

void reverse( int *data, int length )
{
	int left = 0;
	int right = length - 1;

	while( left < right )
	{
		swapIndices( &*(data + left), &*(data + right) );
		left++;
		right--;
	}
}

void siftDown( int *data, int root, int bottom )
{
	int done, maxChild, temp;

	done = 0;
	while ( ( root * 2 <= bottom ) && ( !done ) )
	{
		if ( root * 2 == bottom )
			maxChild = root * 2;
		else if ( *(data + (root * 2) ) > *(data + (root * 2) + 1) )
			maxChild = root * 2;
		else
			maxChild = root * 2 + 1;

		if ( *(data + root) < *(data + maxChild) )
		{
			temp = *(data + root);
			*(data + root) = *(data + maxChild);
			*(data + maxChild) = temp;
			root = maxChild;
		}
		else
		{
			done = 1;
		}
	}
}

void bladeSort( int *data, int start, int end )
{
	if( end > start + 1 )
	{
		int pivot = *(data + start);
		int l = start + 1;
		int r = end;

		while( l < r )
		{
			if( *(data + l) < pivot )
				l++;
			else
			{
				swapIndices(&*(data + l), &*(data + --r));
			}
		}

		swapIndices(&*(data + --l), &*(data + start));
		bladeSort(data, start, l);
		bladeSort(data, r, end);
	}

	IsSorted = true;
}

void heapSort( int *data, int length )
{
	int i, temp;

	for ( i = (length / 2)-1; i >= 0; i-- )
		siftDown(data, i, length);

	for ( i = length-1; i >= 1; i-- )
	{
		temp = data[0];
		*(data) = *(data + i);
		*(data + i) = temp;
		siftDown( data, 0, i-1 );
	}
}

bool Same = true;
bool Increasing = true;
bool Decreasing = true;

void sort_bladezor( int *data, int length )
{
	Same = isSame( data, length );

	if( Same )
	{
		return;
	}

	Increasing = isIncreasing( data, length );
	Decreasing = isDecreasing( data, length );
	IsSorted = false;

	if( Decreasing && !Same )
	{
		reverse( data, length );
		return;
	}
	else
	if( Increasing && !Same )
	{
		return;
	}	
	if( 
		!Same &&
		!Increasing &&
		!Decreasing
	  )
	  if( length < MAX_DEPTH * 2 && !IsSorted )
	  {
		  bladeSort( data, 0, length );
		  IsSorted = true;
		  return;
	  }
	  else if( length >= MAX_DEPTH && !IsSorted )
	  {
		  heapSort( data, length );
		  return;
	  }
}

#endif