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 < high, то мы меняем эти элементы местами.</p>
7
<p>На каждой итерации мы выполняем следующие действия а) выбираем два индекса<strong>low</strong>и<strong>high</strong>, равные крайнему левому и крайнему правому элементам входного массива; б) вычисляем индекс опорного элемента<strong>middle</strong>; в) увеличиваем<strong>low</strong>последовательно до тех пор, пока элемент с индексом low не будет больше или равен опорному; г) уменьшаем high последовательно до тех пор, пока элемент с индексом high не будет меньше или равен опорному; д1) если low = high, то мы нашли середину входного массива; д2) если low < 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(&$arr, $low, $high) { $i = $low; $j = $high; $middle = $arr[ ( $low + $high ) / 2 ]; // middle - опорный элемент; в нашей реализации он находится посередине между low и high do { while($arr[$i] < $middle) ++$i; // ищем элементы для правой части while($arr[$j] > $middle) -$j; // ищем элементы для левой части if($i <= $j){ // перебрасываем элементы $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; // следующая итерация $i++; $j--; } } while($i < $j); if($low < $j){ // рекурсивно вызываем сортировку для левой части quickSort($arr, $low, $j); } if($i < $high){ // рекурсивно вызываем сортировку для правой части quickSort($arr, $i, $high); } }<p>На JavaScript функция не будет сильно отличаться структурно, однако имеются некоторые моменты, касающиеся самого языка. В определении опорного элемента следует принудительно использовать округление, дабы не получить дробный индекс. Массив передается по ссылке по умолчанию, так что хитрить с приведением типов не следует.</p>
13
function quickSort(&$arr, $low, $high) { $i = $low; $j = $high; $middle = $arr[ ( $low + $high ) / 2 ]; // middle - опорный элемент; в нашей реализации он находится посередине между low и high do { while($arr[$i] < $middle) ++$i; // ищем элементы для правой части while($arr[$j] > $middle) -$j; // ищем элементы для левой части if($i <= $j){ // перебрасываем элементы $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; // следующая итерация $i++; $j--; } } while($i < $j); if($low < $j){ // рекурсивно вызываем сортировку для левой части quickSort($arr, $low, $j); } if($i < $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] < middle) { ++i; // ищем элементы для правой части } while(arr[j] > middle) { --j; // ищем элементы для левой части } if(i <= j){ // перебрасываем элементы var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; // следующая итерация i++; j--; } } while(i < j); if(low < j){ // рекурсивно вызываем сортировку для левой части quickSort(arr, low, j); } if(i < 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] < middle) { ++i; // ищем элементы для правой части } while(arr[j] > middle) { --j; // ищем элементы для левой части } if(i <= j){ // перебрасываем элементы var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; // следующая итерация i++; j--; } } while(i < j); if(low < j){ // рекурсивно вызываем сортировку для левой части quickSort(arr, low, j); } if(i < high){ // рекурсивно вызываем сортировку для правой части quickSort(arr, i, high); } }<p>Рабочий пример сортировки можно посмотреть<a>тут</a>.</p>
15
15