用php构建快速排序

用php构建快速排序,php,quicksort,Php,Quicksort,我最近读到了关于quicksort的文章,我想知道用quicksort构建自己的函数来排序是明智的还是低效的。您认为内置排序功能比自建快速排序功能好多少?请坚持使用内置排序功能。快速排序是一种简单的算法,但要在实际使用的计算机上获得良好的性能,需要一些技巧。内置函数很可能已经比您在合理时间内编写的任何函数都要优化。(用C而不是PHP编写的常数因子加速也可能有帮助。) 如果您正在对太多的元素进行排序,以至于排序函数减慢了您的速度,那么您可能是做错了什么。(这毕竟是PHP。您应该使用通用语言进行数据

我最近读到了关于quicksort的文章,我想知道用quicksort构建自己的函数来排序是明智的还是低效的。您认为内置排序功能比自建快速排序功能好多少?

请坚持使用内置排序功能。快速排序是一种简单的算法,但要在实际使用的计算机上获得良好的性能,需要一些技巧。内置函数很可能已经比您在合理时间内编写的任何函数都要优化。(用C而不是PHP编写的常数因子加速也可能有帮助。)

如果您正在对太多的元素进行排序,以至于排序函数减慢了您的速度,那么您可能是做错了什么。(这毕竟是PHP。您应该使用通用语言进行数据密集型处理。这样编写代码会更容易,运行速度也会更快。)

From

注意:与大多数PHP排序一样 函数,sort()使用 实施»快速排序


核心PHP函数将用c实现,而不是用PHP实现,因此它们通常比用PHP编写的任何程序都要快得多。在某些情况下,编写自己的代码会更快,但我想这应该是当您有一个非常具体的案例时,您可以为此进行自己的特定优化。我认为这里的情况不太可能是这样。

事实上,我这样做是为了我正在整理的一篇演讲中的一个数据点。该测试使用本机排序函数和用php编写的快速排序算法实现对250000个整数的数组进行排序。两次运行的数组内容完全相同,数据是随机的,报告的时间仅用于执行排序,而不是调用php解释器所需的其他处理

结果:

Native sort implementation: 1.379 seconds PHP quicksort implementation: 30.615 seconds 本机排序实现:1.379秒 PHP快速排序实现:30.615秒 一定要使用本机实现。任何口译语言都应该如此

我在相同的硬件和操作系统上使用相同的实现,在相同的条件下测试的其他语言的结果提供了一个有趣的性能比较,并对PHP结果进行了透视:

C: 0.107 seconds Java: 0.250 seconds JavaScript (FF3): 4.401 seconds C:0.107秒 Java:0.250秒 JavaScript(FF3):4.401秒
值得注意的是,Chrome和Safari在JavaScript测试中的表现要快得多,但我这里不包括这些测试,因为这些测试是在不同的环境中记录的。

这里有一个PHP实现供参考:


php快速排序(asort、arsort等)的一点是,它们会弄乱相等的值,也就是说,具有不同键的值将随机交换位置,即使在不同的运行之间也是如此。令人惊讶的是,代码可以一次又一次地使用相同的数据生成不同的顺序。最后,我不得不实现我自己的快速排序来消除这种异常现象。

为了好玩,这里是我用PHP编写的quicksort的一个就地版本。这里的技巧是将要排序的数组作为引用传递

function partition(&$arr,$leftIndex,$rightIndex)
{
    $pivot=$arr[($leftIndex+$rightIndex)/2];

    while ($leftIndex <= $rightIndex) 
    {        
        while ($arr[$leftIndex] < $pivot)             
                $leftIndex++;
        while ($arr[$rightIndex] > $pivot)
                $rightIndex--;
        if ($leftIndex <= $rightIndex) {  
                $tmp = $arr[$leftIndex];
                $arr[$leftIndex] = $arr[$rightIndex];
                $arr[$rightIndex] = $tmp;
                $leftIndex++;
                $rightIndex--;
        }
    }
    return $leftIndex;
}

function quickSort(&$arr, $leftIndex, $rightIndex)
{
    $index = partition($arr,$leftIndex,$rightIndex);
    if ($leftIndex < $index - 1)
        quickSort($arr, $leftIndex, $index - 1);
    if ($index < $rightIndex)
        quickSort($arr, $index, $rightIndex);
}
函数分区(&$arr、$leftIndex、$righindex)
{
$pivot=$arr[($leftIndex+$rightIndex)/2];
while($leftIndex$pivot)
$rightIndex--;

如果($leftIndex,请在下面的类中查找,以便在PHP中实现快速排序-

            <?php
            class quickSort{
            /* low  --> Starting index,  high  --> Ending index */
                public $arr;
                public function __construct($arr){
                    $this->arr = $arr;
                }
                public function qsort($low,$high){
                    if($low===null || $high===null){    
                        return false;
                    }
                    if($low < $high){           
                        $pi = $this->partition($low,$high);
                        $this->qsort($low,$pi-1); /*before pivot*/
                        $this->qsort($pi+1,$high); /*before pivot*/
                    }
                }

                /* This function takes last element as pivot, places
                   the pivot element at its correct position in sorted
                    array, and places all smaller (smaller than pivot)
                   to left of pivot and all greater elements to right
                   of pivot */
                public function partition($low,$high){
                    if($low===null || $high===null){
                        return false;
                    }
                    $pivot = $this->arr[$high];
                    $i = $low-1; /*index of smaller element*/

                    for($j = $low; $j <= $high-1; $j++)
                    {
                        // If current element is smaller than or equal to pivot

                        if($this->arr[$j] <= $pivot)
                        {
                            $i++;    // increment index of smaller element
                            $this->swap($i,$j);         
                        }
                    }
                    //swap arr[i + 1] and arr[high])
                    $this->swap($i+1,$high);

                    return $i+1;    
                }

                public function swap($i,$j){
                    $p=$this->arr[$i];
                    $q=$this->arr[$j];
                    $this->arr[$i]=$q;
                    $this->arr[$j]=$p;      
                }
            }
            $arr = array(10, 80, 30, 90, 40, 50, 70);
            $obj = new quickSort($arr);
            $obj->qsort(0,6);
            print_r($obj->arr);


            ?>

在php中这样做非常慢–有更好的方法来解决这个问题。