2009-06-18 5 views
0

Ich habe die folgende PHP-Funktion, und es ändern möchten in Sortierung absteigend, kann mir jemand helfen:Ist es möglich, die Funktion zum schnellen Sortieren zu machen, um das Array absteigend zu sortieren?

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); 

} 
+1

Übrigens, PHP hat viele eingebaute Sortierfunktionen, oder? sort(), rsort() etc. –

Antwort

2

Ganz einfach: wenn Sie Elemente sind zu vergleichen, ein ‚>‘ zu einem ‚<‘ ändern und und umgekehrt.

Dies funktioniert für alle Sortieralgorithmen und jede Art von Reihenfolge: Ersetze alle Vergleiche von Elementen des Arrays durch einen beliebigen Ausdruck, der die Frage eines Elements beantwortet, sollte dem anderen im sortierten Array vorausgehen.

2

Natürlich ist es. Schauen Sie, wie the algorithm funktioniert.

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

Sie werden nur die Art und Weise ändern müssen der Algorithmus entscheidet, ob ein Element größer als eine andere ist - daher müssen Sie den Vergleichsoperator >=-< ändern.

Hinweis: Können Sie nicht einfach builtin sort function verwenden?

+1

+1 für die Notiz, auch! Warum schreibst du es selbst? – xtofl

0

Die ‚allgemeine‘ Art und Weise eine Vergleichsfunktion (Objekt), so etwas wie

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

Sie, wäre die Bereitstellung einer der builtins nicht Ihre eigene Sortierfunktion schreiben verwenden:

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