Быстрая сортировка в php [дубликат]

Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.

Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.

7
задан alex 5 September 2011 в 15:18
поделиться

7 ответов

Из http://php.net/sort

Примечание. Как и большинство функций сортировки PHP, sort () использует реализацию «Quicksort».

Основные функции PHP будут реализованы в c, а не в PHP, поэтому они должны быть значительно быстрее, чем все, что вы можете написать себе на PHP. Будут случаи, когда быстрее писать свои собственные, но я думаю, что это будет, когда у вас есть очень конкретный случай, и вы можете сделать для этого свои собственные конкретные оптимизации. Я думаю, что это вряд ли будет иметь место здесь.

25
ответ дан Tom Haigh 24 August 2018 в 18:55
поделиться

Одна вещь о быстрой сортировке php (asort, arsort и т. д.) заключается в том, что они обменивают ваши равные значения, то есть значения с разными ключами будут случайным образом менять позицию даже между разными прогонами. Удивительно, что код может производить другой порядок, используя одни и те же данные снова и снова. В конце концов, мне пришлось реализовать свой собственный быстрый вид, чтобы удалить эту аномалию.

1
ответ дан Erich 24 August 2018 в 18:55
поделиться

Для справки здесь есть реализация PHP:

https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#PHP

4
ответ дан Haijerome 24 August 2018 в 18:55
поделиться

Придерживайтесь встроенной функцией сортировки. Quicksort - это простой алгоритм, но для получения хорошей производительности на компьютерах, которые на самом деле используются, требуется немного тонкости. Более чем вероятно, что встроенная функция уже оптимизирована, чем все, что вы могли бы написать за разумное время. (Вероятно, использование константного фактора из написания в C вместо PHP также полезно.)

Если вы сортируете так много элементов, что вы замедляете функцию сортировки, вы, вероятно, делаете что-то неправильно , (Это, в конце концов, PHP. Вы должны использовать язык общего назначения для интенсивной обработки данных. Будет проще писать код, и он будет работать быстрее.)

5
ответ дан jrockway 24 August 2018 в 18:55
поделиться

Ниже приведен класс для реализации Quick Sort в 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);


            ?>
0
ответ дан Kripa Yadav 24 August 2018 в 18:55
поделиться

Фактически я сделал это для точки данных на презентации, которую я собираю. Тест сортирует массив из 250 000 целых чисел, используя собственную функцию сортировки и реализацию алгоритма быстрой сортировки, написанного на php. Содержимое массива одинаково для обоих прогонов, данные рандомизированы, а время, указанное только для выполнения сортировки, а не для другой обработки, необходимой для вызова интерпретатора php.

Результаты:

  Native sort implementation:  1.379 seconds
PHP quicksort implementation: 30.615 seconds

Определенно использовать встроенную реализацию. Это должно быть для любого интерпретируемого языка.

Результаты для других языков, которые я тестировал с одинаковыми условиями, используя ту же самую реализацию на одном и том же оборудовании и ОС, обеспечивают интересное сравнение производительности и ставят результат PHP в перспективе:

               C: 0.107 seconds
            Java: 0.250 seconds
JavaScript (FF3): 4.401 seconds

Примечательно, что Chrome и Safari выполнили много быстрее для теста JavaScript, но я не включаю их здесь, потому что эти тесты были записаны в другой среде .

17
ответ дан paul.lovvik 24 August 2018 в 18:55
поделиться

Просто для удовольствия, вот на месте версия quicksort в PHP, с которой я пришел. Трюк здесь состоит в том, чтобы передать массив, который будет отсортирован как ссылка.

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);
}
1
ответ дан s-hunter 24 August 2018 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: