<?php
/**
* QuickSort. This sorting algorithm uses a callback funtion (via a omparator,
* so it can be implied to arrays, objects etc.
*
* This file is part of the Brim project. The brim- project is located at the
* following location: {@link http: //www.brim-project.org/ http://www.brim-project.org/}
*
* <pre> Enjoy :-) </pre>
*
* @author Barry Nauta
* @package org.brim-project.framework
* @subpackage util
*
*
* @copyright [brim-project.org] - Copyright (c) 2003 - 2005 Barry Nauta
*
* @license http://opensource.org/licenses/gpl-license.php
* The GNU Public License
*/
class QuickSort
{
/**
* Default empty constructor
*/
function QuickSort ()
{
// nothing
}
/**
* The actual function
* @param array input object array containing objects to be sorted
* @param object comparator the comparator that compares two objects in
* the input array
*/
function sort (&$input, $comparator)
{
$this->internalSort ($input, $comparator, 0, count($input));
}
/**
* The partial sorting function. Private/internal use only
* @param array input object array containing objects to be sorted
* @param object comparator the comparator that compares two objects in
* the input array
* @param int low the starting offset
* @param int high the ending offset
* @private
*/
function internalSort (&$input, $comparator, $low, $high)
{
if ($low < $high)
{
$tmpLow = $low;
$tmpHigh = $high + 1;
$current = $input[$low];
$done = false;
while (!$done)
{
while (++$tmpLow <= $high &&
$comparator->compare ($input[$tmpLow], $current) < 0);
while ($comparator->compare ($input[--$tmpHigh], $current) >0);
if ($tmpLow < $tmpHigh)
{
$this->swap ($input, $tmpLow, $tmpHigh);
}
else
{
$done = true;
}
}
$this->swap ($input, $low, $tmpHigh);
$this->internalSort ($input, $comparator, $low, $tmpHigh-1);
$this->internalSort ($input, $comparator, $tmpHigh+1, $high);
}
}
/**
* Swap two elements in an array
* @param array input the input array
* @param int i the first element to be swapped
* @param int j the second element to be swapped
* @private
*/
function swap (&$input, $i, $j)
{
$temp = $input[$i];
$input[$i]=$input[$j];
$input[$j]=$temp;
}
}
?>
|