Php 如何对多个列进行快速排序
我想在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)
$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;
}