可以使快速排序函数排序数组降序吗?

时间:2009-06-18 07:18:09

标签: php algorithm sorting quicksort

我有以下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 个答案:

答案 0 :(得分:2)

简单:无论何时比较元素,都要更改'&gt;'到'&lt;'反之亦然。

这适用于所有排序算法和任何类型的排序:用任何表达式替换数组元素的任何比较,回答一个元素的问题应该在排序数组中的另一个元素之前。

答案 1 :(得分:2)

当然是。看看the algorithm是如何运作的。

  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++;
  }

您只需要更改算法决定一个元素是否大于另一个元素的方式 - 因此您必须将比较运算符从>=更改为<

注意:你不能只使用builtin sort function吗?

答案 2 :(得分:0)

'通用'方式是提供比较功能(对象),如

function q_sort( &$numbers, $left, $right,$level, $comparison )
{
...
    if( $comparison->ordered( $left, $right ) )
    {...
    }
}

答案 3 :(得分:0)

不要编写自己的排序函数,使用其中一个内置函数:

function cmp($a, $b) {
        return a->RegID - b->RegID;
}
uasort($a, "cmp");