我想在php中快速输入一些对象。
我正在排序一系列OBJECTS
$object->x;
$object->y;
$object->z;
我想首先按x排序,然后是y,然后是z。
这是我的快速排序功能 它接受一个jobjects数组,并按特定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));
}
我可以使用快速排序递归算法轻松快速排序任何单个列,但将它们组合在一起然后将这些子组排序到第n次真是让我头疼。
我是否有可以查看的算法?
答案 0 :(得分:7)
您需要一种与最初想法不同的方法。而不是递归排序,只做一个排序,一次性排除所有你的标准,排序方式(即如果x相同,测试y,等等上)。
其他人已经指出了将这种称为比较函数作为参数的排序函数。比较函数给出了两个对象,并返回哪个对象小于/大于另一个对象。
在您发布的代码中,您有这样的比较:
if($v->$sortKey < $pivot->$sortKey)
而不是测试$ v-&gt; $ sortKey&lt; $ pivot-&gt; $ 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进行排序。
答案 1 :(得分:2)
您是否正在实施自己的排序?你有签出http://us3.php.net/usort吗?
usort()可以接受比较函数,因此您可以实现几乎任何所需的排序规则。
答案 2 :(得分:1)
排序算法不依赖于比较的机制,只是它返回一致的排序。您需要的是一个排序例程,允许您指定自己的比较函数。
Php提供三种:usort(),uasort()和uksort()。