обновить этот алгоритм быстрой сортировки для обработки сортировки по определенному ключу

Я считаю, что если вы имеете дело с полностью перемешанными наборами данных, быстрая сортировка является одним из лучших способов обработки сортировки. Я хотел бы обновить следующий код для обработки массивов с ключами, чтобы он мог сортировать список массивов, в отличие от значений только в одном массиве.

function quicksort($array) {
if (count($array) == 0)
return array();

$pivot = $array[0];
$left = $right = array();

for ($i = 1; $i < count($array); $i++) {
if ($array[$i] < $pivot)
$left[] = $array[$i];
else
$right[] = $array[$i];
}
return array_merge(self::quicksort($left, ''), array($pivot), self::quicksort($right, ''));
}

-3

Решение

используя usort () с анонимная функция

<?php
$arr = array(
array("val" => 10, "something" => "zzz", "val2" => 1110),
array("val" => 111, "something" => "aaa", "val2" => 1),
array("val" => 1, "something" => "bbb", "val2" => 12),
array("val" => 14, "something" => "eee", "val2" => 31),
array("val" => 2, "something" => "ccc", "val2" => 11),
);

usort($arr, function ($a, $b) {
if ($a['val2'] > $b['val2']) {
$result = 1;
} elseif ($a['val2'] < $b['val2']) {
$result = -1;
} else {
$result = 0;
}
return $result;
});

var_dump($arr);

попробуйте подумать о шаблоне проектирования стратегии сортировки

<?php
class SortStrategy
{
public $key;

public function __construct($key)
{
$this->key = $key;
}

public function cmp($a, $b)
{
return ($a[$this->key] > $b[$this->key]) ? 1 : (($a[$this->key] < $b[$this->key]) ? -1 : 0);
}
}

$arr = array(
array("val" => 10, "something" => "zzz", "val2" => 1110),
array("val" => 111, "something" => "aaa", "val2" => 1),
array("val" => 1, "something" => "bbb", "val2" => 12),
array("val" => 14, "something" => "eee", "val2" => 31),
array("val" => 2, "something" => "ccc", "val2" => 11),
);

// sort by val2 key
$objSortStrategy = new SortStrategy('val2');
usort($arr, [$objSortStrategy, 'cmp']);
var_dump($arr);

// sort by val key
$objSortStrategy->key = 'val';
usort($arr, [$objSortStrategy, 'cmp']);
var_dump($arr);

// sort by something key
$objSortStrategy->key = 'something';
usort($arr, [$objSortStrategy, 'cmp']);
var_dump($arr);

ПРИМЕЧАНИЕ: это только быстрый пример, чтобы дать вам несколько идей

1

Другие решения

ОК, РЕШЕНО. Я отредактировал быструю сортировку и заставил ее работать:

public static function quicksort($array, $key = '')
{
if ($key) {
if (count($array) == 0)
return array();

$pivot = $array[0];
$left = $right = array();

for ($i = 1; $i < count($array); $i++) {
if ($array[$i][$key] < $pivot[$key])
$left[] = $array[$i];
else
$right[] = $array[$i];
}
return array_merge(self::quicksort($left, $key), array($pivot), self::quicksort($right, $key));

} else {

if (count($array) == 0)
return array();

$pivot = $array[0];
$left = $right = array();

for ($i = 1; $i < count($array); $i++) {
if ($array[$i] < $pivot)
$left[] = $array[$i];
else
$right[] = $array[$i];
}
return array_merge(self::quicksort($left, ''), array($pivot), self::quicksort($right, ''));

}
}

образец:

$qsort = new Algorithms();
$arr = array(
array("val" => 10, "something" => "zzz", "val2" => 1110),
array("val" => 111, "something" => "aaa", "val2" => 1),
array("val" => 1, "something" => "bbb", "val2" => 12),
array("val" => 14, "something" => "eee", "val2" => 31),
array("val" => 2, "something" => "ccc", "val2" => 11),
);
var_dump($qsort->quicksort($arr,"val2"));
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector