Hızlı sıralama işlevi sıralama dizi azalan yapmak mümkün mü?

4 Cevap php

Ben şu php işlevi var ve birisi bana yardımcı olabilir, sıralama azalan içine değiştirmek istiyorum:

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 Cevap

Basit: Eğer öğeleri karşılaştırarak konum zaman, bir '<' için bir '>' değişecek ve tersi.

Bir elemanın sorusunu sıralanmış diziye diğer önüne gerektiğini cevaplayarak herhangi bir ifadeye göre dizinin elemanlarının herhangi bir karşılaştırma değiştirin: Bu, tüm sıralama algoritmaları ve sipariş her türlü çalışır.

Tabii ki öyle. Sadece the algorithm nasıl çalıştığını bakmak.

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

Sadece algoritma bir unsur diğerinden daha büyük olup olmadığını karar verir biçimini değiştirmek zorunda olacak - Dolayısıyla < için >= gelen karşılaştırma operatörü değiştirmeniz gerekir.

Not: Eğer sadece kullanmak değil miyim builtin sort function?

'Genel' bir yol gibi bir şey, bir karşılaştırma işlevi (nesne) sağlamak olacaktır

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

Kendi sıralama işlevi yazmayın, yerleşikleri birini kullanın:

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