Php 如何对多个列进行快速排序

Php 如何对多个列进行快速排序,php,algorithm,sorting,quicksort,Php,Algorithm,Sorting,Quicksort,我想在php中对一些对象进行快速排序 我正在对一组对象进行排序 $object->x; $object->y; $object->z; 我想先按x排序,然后按y排序,然后按z排序 这是我的快速排序功能 其中它接受一个Jobject数组,并按特定的sortkey(x、y或z列)进行排序 该函数返回已按sortkey排序的对象的排序数组 private function quicksort($objects, $sortKey) { if(count($objects)

我想在php中对一些对象进行快速排序

我正在对一组对象进行排序

$object->x;
$object->y;
$object->z;
我想先按x排序,然后按y排序,然后按z排序

这是我的快速排序功能 其中它接受一个Jobject数组,并按特定的sortkey(x、y或z列)进行排序 该函数返回已按sortkey排序的对象的排序数组

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));
}
私有函数快速排序($objects,$sortKey){
如果(计数($objects)<2)返回$objects;
$left=$right=array();
重置($对象);
$pivot_key=key($objects);
$pivot=数组移位($objects);
foreach($k=>$v的对象){
如果($v->$sortKey<$pivot->$sortKey)
$left[$k]=$v;
其他的
$right[$k]=$v;
}
返回数组\u merge($this->quicksort($left,$sortKey)),数组($pivot\u key=>$pivot),$this->quicksort($right,$sortKey));
}
我可以使用快速排序递归算法轻松地对任何单个列进行快速排序,但将它们分组,然后将这些子组排序到第n次,这真是让我头疼


有没有一种算法可以让我看看?

您是否实现了自己的排序?你退房了吗


usort()可以接受比较函数,因此您可以实现几乎任何您想要的排序规则。

排序算法不依赖于比较的机制,只返回一致的排序。您需要的是一个排序例程,它允许您指定自己的比较函数


Php提供了三种方法:usort()、uasort()和uksort()。

您需要一种与最初想法不同的方法。不要递归排序,只做一次排序,一次考虑所有标准,按顺序排序(即,如果x相同,测试y,等等)

其他人已经指出,排序函数以一个名为的比较函数作为参数。比较函数提供两个对象,并返回哪个对象比另一个对象小/大

在您发布的代码中,您有以下比较:

    if($v->$sortKey < $pivot->$sortKey)
在函数
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;
}
private函数较小($obj1,$obj2){
如果($obj1->x<$obj2->x)
返回true;
如果($obj1->x>$obj2->x)
返回false;
如果($obj1->y<$obj2->y)
返回true;
如果($obj1->y>$obj2->y)
返回false;
}
。。。等等如您所见,排序将确保按照x排序,并且在x相同(不更小,不更大)的情况下,继续按照y排序

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