2010-10-11 93 views
3

我期待在php中快速排列一些對象。如何快速排列多列

即時用x分選物體

陣列
$object->x; 
$object->y; 
$object->z; 

我想先排序,則y,則z。

這是我的快速排序功能 哪裏它接受jobjects的陣列,和由一個特定的排序關鍵字(X,Y,或Z柱) 該函數返回的對象的排序後的數組,即已經由排序關鍵字進行排序排序。

private function quicksort($objects, $sortKey) { 
    if(count($objects) < 2) return $objects; 

    $left = $right = array(); 

    reset($objects); 
    $pivot_key = key($objects); 
    $pivot = array_shift($objects); 

    foreach($objects as $k => $v) { 
     if($v->$sortKey < $pivot->$sortKey) 
      $left[$k] = $v; 
     else 
      $right[$k] = $v; 
    } 

    return array_merge($this->quicksort($left,$sortKey), array($pivot_key => $pivot), $this->quicksort($right,$sortKey)); 
} 

我可以很容易地快速排序使用快速排序遞歸算法,但他們一起分組,然後排序這些分組到第n次的任何單列真的把我的頭搞亂。

有沒有我可以查看的算法?

回答

7

您需要一種與您最初想法不同的方法。而不是遞歸排序,只需要一個排序需要全部您的標準一次,以排序的方式(即如果x是相同的,測試y,等等)記在腦海中。

其他人已經指出了以比較函數作爲參數的排序函數。比較函數給出兩個對象,並返回哪個對象比另一個更小/更大。

在您發佈的代碼,你有這樣的比較:

if($v->$sortKey < $pivot->$sortKey) 

代替測試$訴 - > $ SORTKEY < $支點 - > $ SORTKEY,你需要在你自己的比較函數的調用,例如

if (smaller($v, $pivot)) 

在功能smaller()中,您定義了您的規則。

private function smaller($obj1, $obj2) { 
    if ($obj1->x < $obj2->x) 
     return true; 
    if ($obj1->x > $obj2->x) 
     return false; 
    if ($obj1->y < $obj2->y) 
     return true; 
    if ($obj1->y > $obj2->y) 
     return false; 
} 

...等等。如您所見,排序將確保按x排序,並且在x相同(不小於,不大於)的情況下,按y繼續排序。

2

您是否正在實施自己的排序?你有沒有退房http://us3.php.net/usort? ()可以接受比較函數,所以你可以實現幾乎任何你想要的排序規則。

1

排序算法不依賴於比較的機制,只是它返回一致的排序。你需要的是一個排序例程,它允許你指定你自己的比較函數。

Php提供三種:usort(),uasort()和uksort()。