我写了一个快速排序算法但是,我想在某处进行更改,以便此快速排序按降序输出元素。
我搜索并发现我可以将partition()中的比较运算符(<)改为其他方式(如下所示)。
//This is snippet from partition() function
while($array[$l] < $pivot) { $l++; }
while($array[$r] > $pivot) { $r--; }
但它不起作用..
如果我快速排序下面的数组, $ array =(3,9,5,7);
应该是:
$ array =(9,7,5,3)
但实际输出是:
$ array =(3,5,7,9)
下面是我的快速排序,试图按降序输出元素。 我应该如何进行更改才能按降序排序?如果您需要任何澄清,请告诉我。谢谢!
$array = array(3,9,5,7);
$app = new QuicksortDescending();
$app->quicksortDesc($array, 0, count($array));
print_r($array);
class QuicksortDescending {
public function partitionDesc(&$array, $left, $right) {
$l = $left;
$r = $right;
$pivot = $array[($right+$left)/2];
while($l <= $r) {
while($array[$l] > $pivot) { $l++; }
while($array[$r] < $pivot) { $r--; }
if($l <= $r) {// if L and R haven't cross
$this->swap($array, $l, $r);
$l ++;
$j --;
}
}
return $l;
}
public function quicksortDesc(&$array, $left, $right) {
$index = $this->partitionDesc($array, $left, $right);
if($left < $index-1) { //if there is more than 1 element to sort on right subarray
$this->quicksortDesc($array, $left, $index-1);
}
if($index < $right) { //if there is more than 1 element to sort on right subarray
$this->quicksortDesc($array, $index, $right);
}
}
public function swap(&$array, $index1, $index2) {
$tmp = $array[$index1];
$array[$index1] = $array[$index2];
$array[$index2] = $tmp;
}
}
答案 0 :(得分:5)
在比较两个元素时,只需将比较运算符<
与>
交换,反之亦然:
while($array[$l] < $pivot) { $l++; }
while($array[$r] > $pivot) { $r--; }
答案 1 :(得分:3)
不是改变快速排序实现,而是从末尾迭代数组:
for ($i = count($array)-1; $i>=0; $i--) {
// do something with $array[$i];
}