HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: quicksort, алгоритмы сортировки, php программирование, сортировка на php, быстрая сортировка</p>
1 <p>Теги: quicksort, алгоритмы сортировки, php программирование, сортировка на php, быстрая сортировка</p>
2 <p>В этой статье поговорим о<strong>Быстрой сортировке</strong>(quicksort). Почему именно она? На мой взгляд, эта сортировка отлично подходит для решения повседневных задач. Ниже я приведу принцип данной сортировки и две её реализации - на<strong>PHP</strong>и<strong>JavaScript</strong>.</p>
2 <p>В этой статье поговорим о<strong>Быстрой сортировке</strong>(quicksort). Почему именно она? На мой взгляд, эта сортировка отлично подходит для решения повседневных задач. Ниже я приведу принцип данной сортировки и две её реализации - на<strong>PHP</strong>и<strong>JavaScript</strong>.</p>
3 <p>Wiki говорит, что быстрая сортировка была придумана английским информатиком Чарльзом<strong>Хоаром</strong>в 1960 году.</p>
3 <p>Wiki говорит, что быстрая сортировка была придумана английским информатиком Чарльзом<strong>Хоаром</strong>в 1960 году.</p>
4 <p>Сортировка работает следующим образом:</p>
4 <p>Сортировка работает следующим образом:</p>
5 <p>1) Выбирается опорный элемент. Его можно выбрать случайно, обозначить его последним или средним - это всё не будет влиять на эффективность.</p>
5 <p>1) Выбирается опорный элемент. Его можно выбрать случайно, обозначить его последним или средним - это всё не будет влиять на эффективность.</p>
6 <p>2) Массив перестраивается следующим образом: слева от опорного алгоритма находятся элементы, которые меньше его или равны ему, справа - элементы, которые больше него.</p>
6 <p>2) Массив перестраивается следующим образом: слева от опорного алгоритма находятся элементы, которые меньше его или равны ему, справа - элементы, которые больше него.</p>
7 <p>На каждой итерации мы выполняем следующие действия а) выбираем два индекса<strong>low</strong>и<strong>high</strong>, равные крайнему левому и крайнему правому элементам входного массива; б) вычисляем индекс опорного элемента<strong>middle</strong>; в) увеличиваем<strong>low</strong>последовательно до тех пор, пока элемент с индексом low не будет больше или равен опорному; г) уменьшаем high последовательно до тех пор, пока элемент с индексом high не будет меньше или равен опорному; д1) если low = high, то мы нашли середину входного массива; д2) если low &lt; high, то мы меняем эти элементы местами.</p>
7 <p>На каждой итерации мы выполняем следующие действия а) выбираем два индекса<strong>low</strong>и<strong>high</strong>, равные крайнему левому и крайнему правому элементам входного массива; б) вычисляем индекс опорного элемента<strong>middle</strong>; в) увеличиваем<strong>low</strong>последовательно до тех пор, пока элемент с индексом low не будет больше или равен опорному; г) уменьшаем high последовательно до тех пор, пока элемент с индексом high не будет меньше или равен опорному; д1) если low = high, то мы нашли середину входного массива; д2) если low &lt; high, то мы меняем эти элементы местами.</p>
8 <p>3) Далее мы начинаем рекурсивно упорядочивать полученные два массива из элементов, лежащих справа и слева от опорного элемента соответственно.</p>
8 <p>3) Далее мы начинаем рекурсивно упорядочивать полученные два массива из элементов, лежащих справа и слева от опорного элемента соответственно.</p>
9 <p>4) Рекурсивное обращение продолжается до тех пор, пока все входные наборы не будут содержать один или два элемента.</p>
9 <p>4) Рекурсивное обращение продолжается до тех пор, пока все входные наборы не будут содержать один или два элемента.</p>
10 <p>Данная сортировка - это глубокое улучшение сортировки "<strong>пузырьком</strong>". Она является одним из самых быстродействующих алгоритмов сортировки общего назначения.</p>
10 <p>Данная сортировка - это глубокое улучшение сортировки "<strong>пузырьком</strong>". Она является одним из самых быстродействующих алгоритмов сортировки общего назначения.</p>
11 <h2>От теории к практике</h2>
11 <h2>От теории к практике</h2>
12 <p>Рассмотрим реализацию на PHP. В функцию quickSort передаём три параметра: массив (по ссылке), левую границу и правую границу. Сразу же определяем<strong>$middle</strong>- опорный элемент. Мы возьмём в качестве него средний элемент массива. Далее начинаем два циклических обхода справа и слева до нахождения бОльшего и мЕньшего элементов относительно опорного, перебрасываем их. Затем рекурсивно вызываем quickSort для двух полученных массивов. Здесь всё достаточно просто, а код функции будет выглядеть вот так:</p>
12 <p>Рассмотрим реализацию на PHP. В функцию quickSort передаём три параметра: массив (по ссылке), левую границу и правую границу. Сразу же определяем<strong>$middle</strong>- опорный элемент. Мы возьмём в качестве него средний элемент массива. Далее начинаем два циклических обхода справа и слева до нахождения бОльшего и мЕньшего элементов относительно опорного, перебрасываем их. Затем рекурсивно вызываем quickSort для двух полученных массивов. Здесь всё достаточно просто, а код функции будет выглядеть вот так:</p>
13 function quickSort(&amp;$arr, $low, $high) { $i = $low; $j = $high; $middle = $arr[ ( $low + $high ) / 2 ]; // middle - опорный элемент; в нашей реализации он находится посередине между low и high do { while($arr[$i] &lt; $middle) ++$i; // ищем элементы для правой части while($arr[$j] &gt; $middle) -$j; // ищем элементы для левой части if($i &lt;= $j){ // перебрасываем элементы $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; // следующая итерация $i++; $j--; } } while($i &lt; $j); if($low &lt; $j){ // рекурсивно вызываем сортировку для левой части quickSort($arr, $low, $j); } if($i &lt; $high){ // рекурсивно вызываем сортировку для правой части quickSort($arr, $i, $high); } }<p>На JavaScript функция не будет сильно отличаться структурно, однако имеются некоторые моменты, касающиеся самого языка. В определении опорного элемента следует принудительно использовать округление, дабы не получить дробный индекс. Массив передается по ссылке по умолчанию, так что хитрить с приведением типов не следует.</p>
13 function quickSort(&amp;$arr, $low, $high) { $i = $low; $j = $high; $middle = $arr[ ( $low + $high ) / 2 ]; // middle - опорный элемент; в нашей реализации он находится посередине между low и high do { while($arr[$i] &lt; $middle) ++$i; // ищем элементы для правой части while($arr[$j] &gt; $middle) -$j; // ищем элементы для левой части if($i &lt;= $j){ // перебрасываем элементы $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; // следующая итерация $i++; $j--; } } while($i &lt; $j); if($low &lt; $j){ // рекурсивно вызываем сортировку для левой части quickSort($arr, $low, $j); } if($i &lt; $high){ // рекурсивно вызываем сортировку для правой части quickSort($arr, $i, $high); } }<p>На JavaScript функция не будет сильно отличаться структурно, однако имеются некоторые моменты, касающиеся самого языка. В определении опорного элемента следует принудительно использовать округление, дабы не получить дробный индекс. Массив передается по ссылке по умолчанию, так что хитрить с приведением типов не следует.</p>
14 function quickSort(arr, low, high) { var i = low; var j = high; var middle = arr[ Math.round(( low + high ) / 2) ]; // middle - опорный элемент; в нашей реализации он находится посередине между low и high do { while(arr[i] &lt; middle) { ++i; // ищем элементы для правой части } while(arr[j] &gt; middle) { --j; // ищем элементы для левой части } if(i &lt;= j){ // перебрасываем элементы var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; // следующая итерация i++; j--; } } while(i &lt; j); if(low &lt; j){ // рекурсивно вызываем сортировку для левой части quickSort(arr, low, j); } if(i &lt; high){ // рекурсивно вызываем сортировку для правой части quickSort(arr, i, high); } }<p>Рабочий пример сортировки можно посмотреть<a>тут</a>.</p>
14 function quickSort(arr, low, high) { var i = low; var j = high; var middle = arr[ Math.round(( low + high ) / 2) ]; // middle - опорный элемент; в нашей реализации он находится посередине между low и high do { while(arr[i] &lt; middle) { ++i; // ищем элементы для правой части } while(arr[j] &gt; middle) { --j; // ищем элементы для левой части } if(i &lt;= j){ // перебрасываем элементы var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; // следующая итерация i++; j--; } } while(i &lt; j); if(low &lt; j){ // рекурсивно вызываем сортировку для левой части quickSort(arr, low, j); } if(i &lt; high){ // рекурсивно вызываем сортировку для правой части quickSort(arr, i, high); } }<p>Рабочий пример сортировки можно посмотреть<a>тут</a>.</p>
15  
15