Можно ли сделать функцию быстрой сортировки массивом сортировки по убыванию? - PullRequest
0 голосов
/ 18 июня 2009

Я получил следующую функцию php и хочу изменить ее на сортировку по убыванию, может кто-нибудь мне помочь:

function quickSort(&$numbers, $array_size,$level)
{
   q_sort($numbers, 0, $array_size - 1,$level);
}


function q_sort(&$numbers, $left, $right,$level)
{
   $l_hold = $left;
   $r_hold = $right;
   $pivot = $numbers[$left];


   while ($left < $right)
   {
      if ($level == 'RegID')
      {
         while (($numbers[$right]->RegID >= $pivot->RegID) && ($left < $right))
            $right--;
      }


      if ($left != $right)
      {
         $numbers[$left] = $numbers[$right];
         $left++;
      }

      if($level == 'RegID')
      {
         while (($numbers[$left]->RegID >= $pivot->RegID) && ($left < $right))
            $left++;
      }



      if ($left != $right)
      {
         $numbers[$right] = $numbers[$left];
         $right--;
      }
   }

   $numbers[$left] = $pivot;
   $pivot = $left;
   $left = $l_hold;
   $right = $r_hold;

   if ($left < $pivot)
      q_sort($numbers, $left, $pivot-1,$level);
   if ($right > $pivot)
      q_sort($numbers, $pivot+1, $right,$level);

}

Ответы [ 4 ]

2 голосов
/ 18 июня 2009

Конечно, это так. Посмотрите, как работает алгоритм .

  if ($level == 'RegID')
  {
     // Comparison
     while (($numbers[$right]->RegID >= $pivot->RegID) && ($left < $right))
        $right--;

  }


  if ($left != $right)
  {
     $numbers[$left] = $numbers[$right];
     $left++;
  }

  if($level == 'RegID')
  {
     // Comparison
     while (($numbers[$left]->RegID >= $pivot->RegID) && ($left < $right))
        $left++;
  }

Вам просто нужно изменить способ, которым алгоритм решает, является ли один элемент больше другого - следовательно, вы должны изменить оператор сравнения с >= на <.

Примечание: Разве вы не можете просто использовать встроенную функцию сортировки ?

2 голосов
/ 18 июня 2009

Простой: всякий раз, когда вы сравниваете элементы, меняйте '>' на '<' и наоборот. </p>

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

0 голосов
/ 18 июня 2009

Не пишите свою собственную функцию сортировки, используйте одну из встроенных функций:

function cmp($a, $b) {
        return a->RegID - b->RegID;
}
uasort($a, "cmp");
0 голосов
/ 18 июня 2009

«Универсальный» способ - предоставить функцию сравнения (объект), что-то вроде

function q_sort( &$numbers, $left, $right,$level, $comparison )
{
...
    if( $comparison->ordered( $left, $right ) )
    {...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...