Набросок простого алгоритма для сортировки элементов массива методом Quicksort / Быстрая сортировка.
Разминка для мозга: Ручная сортировка массивов Quicksort / Быстрая сортировка на php.
29.05.2017
test1.php (Download)
<?
require_once('class.qsort.php');
$aIn = array();
for($i = 0; $i < 100; $i++)
{
$aIn[] = rand(-100, 100);
}
echo '<pre>';
print_r($aIn);
echo '</pre><hr/>';
$oQsort = new cQsort();
$aIn = $oQsort->go($aIn);
echo '<pre>';
print_r($aIn);
echo '</pre><hr/>';class.qsort.php (Download)
<?
class cQsort
{
protected $_aIn = array();
function __construct()
{
}
protected function _sort($iLeft, $iRight)
{
//Вычисляем 'центр', на который будем опираться. Берем значение центральной ячейки массива.
$elCenter = $this->_aIn[($iLeft + $iRight) / 2];
$l = $iLeft;
$r = $iRight;
do
{
// Ищем значения меньше 'центра'
while ($this->_aIn[$l] < $elCenter) {
$l++;
}
// Ищем значения больше 'центра'
while ($this->_aIn[$r] > $elCenter) {
$r--;
}
// Проверяем, есть ли смысл менять местами
if ($l <= $r)
{
// меняем ячейки друг с другом.
list($this->_aIn[$r], $this->_aIn[$l]) = array($this->_aIn[$l], $this->_aIn[$r]);
// И переводим счетчики на следующий элементы
$l++;
$r--;
}
}
while($l <= $r);
// Если не достигои правого края
if ($l < $iRight)
{
// Передаем текущие начало и конец
$this->_sort($l, $iRight);
}
// Если не достигои левого края
if ($r > $iLeft)
{
// Передаем начало и текущий конец
$this->_sort($iLeft, $r);
}
}
public function go(&$aIn)
{
$this->_aIn = $aIn;
$this->_sort(0, count($this->_aIn) -1);
return $this->_aIn;
}
}