ProfiPHPProfiPHP
Категория: Полезное в PHP

Сортировка массива в PHP

В данной теме рассмотрим самый простой метод сортировки массива. Одним из наиболее известных методов, который учит каждый школьник на уроке информатики при изучении языка программирования Pascal, является так называемый метод "пузыря".

Чтобы более понять его идею, представьте, что массив расположен вертикально. Элементы с большими значениями всплывают вверх наподобие больших пузырей. При первом проходе вдоль массива, начиная проход "снизу", берется первый элемент и поочередно сравнивается со следующими.

Не имеет значения, сравниваются по очереди элементы массива начиная снизу, либо сверху. Лично для меня лучше сравнения начинать с первого элемента массива, и по очереди иди до последнего.

Принцип работы заключается в следующем, если первый элемент имеет большее значение чем другой, то они меняются местами, и этой перестановкой меньший элемент становится "эталоном" для сравнения, и все последующие сравниваются с ним. Данная операция продолжается до тех пор, пока не будут сравнению все элементы массива.

В результате наименьший (или наибольший) элемент оказывается в самом верху массива.

Для того, чтобы более понять принцип работы, посмотрите на изображение:

Теперь опишем данный метод с практической стороны. Реализация в PHP выглядит примерно так:
$myarray = array( '9', '8', '1', '3', '2' );
print_r( $myarray );
$count = count( $myarray );
if ( $count >= 2 )
{
for ( $i = 0; $i < $count - 1; $i++ )
{
for ( $j = $i + 1; $j < $count; $j++ )
{
if ( $myarray[$i] > $myarray[$j] )
{
$tmp = $myarray[$i];
$myarray[$i] = $myarray[$j];
$myarray[$j] = $tmp;
}
}
}
}
print_r ($myarray);
Результат выполнения:
Array ( [0] => 9 [1] => 8 [2] => 1 [3] => 3 [4] => 2 ) 
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 8 [4] => 9 )
И пусть вас не смущает использование временной переменной. Можно привести простой пример: у вас два камешка, и вы захотели поменять их местами. Сначала берете один в руку, второй переводите на место первого и первый из руки кладете на место другого. Сама физическая реальность такова, что без временной переменной в виде руки у вас ничего не получится. Таков наш мир. Возможно когда-нибудь мы переродились в другой реальности, где будет возможно другое.

Видел случаи, когда вместо временной переменной используют конструкцию List. Сейчас я на практике докажу, почему лучше использовать временную переменную. При 1000 элементах массива в худшем варианте может исполниться огромное количество итераций. Мы приумножим данное количество и измерим время выполнения 10000000 итераций:
$btime = microtime( true );
$myarray = array( '9', '8' );
for ( $i = 1; $i < 10000000; $i++ ) {
list($myarray[0], $myarray[1]) = array($myarray[1], $myarray[0] );
}
echo round( microtime( true ) - $btime, 4 );
Время выполнения скрипта при данном варианте 4.18 секунды.
$btime = microtime( true );
$myarray = array( '9', '8' );
for ( $i = 1; $i < 10000000; $i++ ) {
$tmp = $myarray[0];
$myarray[0] = $myarray[1];
$myarray[1] = $tmp;
}
echo round( microtime( true ) - $btime, 4 );
Скрипт исполнился за 2.32 секунды. Использование временной переменной практически в 2 раза по скорости работает быстрее конструкция List. Вывод делайте сами.

Добавить комментарий

Имя:
Текст комментария: