Учитывая вышестоящие рекомендации: Код (Text): <? function my_sort(&$arr){ $sz = count($arr); for ($i=1; $i < $sz; $i++){ if ($arr[$i-1] > $arr[$i]){ //Если текущий эл-т меньше предыдущего, то... $temp = $arr[$i-1]; //..."Меняем местами ".$arr[$i-1]." и ".$arr[$i]." $arr[$i-1] = $arr[$i]; $arr[$i] = $temp; $i--;$i-- } } return $arr; } ?> Значит так... алгоритм.... хорошо, попробуем... 1. Начинаем проверять с второго элемента, он имеет индекс "1" Если второй элемент больше первого, то: 1.1. меняме их местами 1.2. Смещаем индекс $i на две единицы влево... Получаем к примеру 0 2. Цикл пошел на второй круг... скрипт увеличил индекс на 1, получилось $i == 1 3. Опять сравнили: второй элемент больше ли первого... мы помним, что в прошлый раз мы проверили эти два элемента и уже поменяли их местами, значит пропускаем участок кода и переходим на третий круг. 4. Обнаружили например, что третий элемент больше второго: 4.1. Поменяли их местами, 4.2 Уменьшили индекс на два ($i == 1) 5. При переходе на следующий, четвертый круг опять увеличится индекс на 1 ($i == 2) ... Может быть не совсем понятно объясняю, но вроде так... Как видим, за пределы массива мы не выходим... 2Raa Прости, что нечетко формулирую мысли: "не согласен" - с тем, что приемлемо начинать программировать с php... не знаю, может кто и начал с него, но для меня эта ситуация выглядит жутко 2Raa А что такое нотисы?
Если у тебя $i = 1, и ты смешаешь указатель влево на 2 единицы, то получишь к примеру не 0, а -1 ) Включи нотисы в PHP, а то ты не видишь ошибок в своем коде. php.ini Код (Text): error_reporting = E_ALL
2Raa да... понял... выглядит жутко... опять промазал ничего не вижу кроме: Код (Text): for ... { $i = ($i==0)?1:$i; ...
Прочитал тут фамилию Фаронов. НОВИЧКИ!!! Не спутайте учебник по паскалю с книгой TURBO PASCAL 7.0 Практика программирования этого же автора!!! В этой книжке сложно разбираться.
Ну, то что мы вышли за пределы массива - это мы уже увидили Алгоритм, в общем, ясен. Только это не доказательство его работоспособности По-моему, это не пузырьковый метод. Это больше похоже на "линейную" сортировку. Только здесь вместо того, чтобы находить минимальный (максимальный) элементы и ставить их по порядку, берется следующий по порядку элемент и ставится на свое место среди ранее отсортированных. Плюс курсор еще постоянно пробегает по уже отсортированной части массива, что явно излишне.
Если интересно - думай, как изменить алгоритм, чтобы курсор не делал лишнюю беготню взад-вперед. Маленька подсказка-проверка на результат: здесь на самом деле два цикла: один вложен в другой. Просто ты развернул их в один. Сделаешь с двумя - все будет проще выглядеть, и проблема с выходом за границы массива должна решиться.
вот что получилось с учетом замечаний: PHP: <?php $ar = array (1,12,334,5,66,7,9,0); foreach ($ar as $value) { echo $value; echo "\n<br>"; } function sorting(&$arr){ // This function use "SelectSort" method. $size = count($arr); for ($i = 0; $i < $size; $i++) { $min = $arr[$i]; $key = $i; for ($j = $i+1; $j < $size; $j++) { if ( $arr[$j] < $min ) { $key = $j; $min = $arr[$j]; } } $arr[$key] = $arr[$i]; $arr[$i] = $min; } return $arr; } echo "<br><br>"; foreach (sorting($ar) as $value) { echo $value; echo "\n<br>"; } ?>
Ну, все круто. Только направление сортировки вообще куда-то исчезло. И результат теперь не пойми с какой стороны ловить. Если я пишу вот так PHP: <?php $aSource = (1,3,2); $aResult = sorting($aSource); ?> то имею в итоге два одинаковых массива, а исходный массив потерян. Зачем тогда возвращать значение, если ты массив по ссылке принимаешь? Кстати... А как ты так преобразовал код, что у тебя даже метод сортировки изменился? А где ж пузырек? Или тебя обломало его оптимизировать, и ты решил по-тихому воспользоваться другим методом? ))
var_dump пользовал. про implode видел ссылочку в мануале по var_dump, но руки не дошли. вообще отладочными функциями не занимался. и соответственно выводом пока не заморачивался.
согласен - баг. зашел разговор про алгоритмы - было как-то стыдно пузырьковый применять после таких супер оптимизаторов как topas. :roll:
Ой, да ладно тебе! Нашел чего стыдиться. Имхо, интереснее было бы оптимизировать пузырек, чем заменить его линейной сортировкой, не менее известной, но не с таким смешным названием Кстати, народ, а кто-нибудь в курсе, как называется метод, который реализовал topas?
пардон, за оффтоп, но как мне это сделать? у меня на FreeBSD только ls -al /var/db/pkg | grep php drwxr-xr-x 2 root wheel 512 10 окт 2005 mod_php4-4.4.0,1 drwxr-xr-x 2 root wheel 512 10 окт 2005 php4-mysql-4.4.0 только mod_php ls -al /usr/local/etc/ | grep php drwxr-xr-x 2 root wheel 512 10 окт 2005 php -r--r--r-- 1 root wheel 96 10 окт 2005 php.conf -r--r--r-- 1 root wheel 38652 10 окт 2005 php.ini-dist -r--r--r-- 1 root wheel 39482 10 окт 2005 php.ini-recommended php.ini ни разу не использоватлся. куды бечь?
Е мае куда я попал ..... что вы сделали с моей темкой главное тема называлась "помощь начинающЕМУУУУУ (ед.число) теперь х. поймешь что да как) Вот моя сортировочка PHP: <? $arr=array(3,9,2,6,8,4,0,1,5); for($i=0; $i<count($arr); $i++) { for ($ii=count($arr)-1; $ii>$i; $ii--) { $m=$ii-1; if($arr[$m]>$arr[$ii]) { $mem=$arr[$m]; $arr[$m]=$arr[$ii]; $arr[$ii]=$mem; } } } foreach ($arr as $key=>$value) { print "$key = $value<br>"; } ?> Ну теперь займусь заданием Raa если некто непротив
не знаю. мне кажется это что-то из неизданного не верю я что он работает. не верю(с) я сегодня штудировал http://algolist.manual.ru/sort/ так вот такое отютение что такой простой код был бы самым оптимальным. там ребята такие вещи крутят. математику прикручивают. опять же если в цикле счетчик туда сюда возможно зацикливание...
Оххх... Вот чего не знаю - того не знаю. Посмотри php.conf - мож это он? Если нет, попробуй созда php.ini на основе php.ini-recommendedю Если не поможет, попробуй создай в каталоге сайта файл .htaccess и впиши туда такую строку: php_value error_reporting 2047 или прямо в коде PHP напиши такое (обычно делает в общем инклуде) error_reporting(E_ALL); ЛоЛ. А я вот только вспоминал тебя: "а где же автор темы?" ) Я тоже не уверен, что это где-то издано Однако, логика прослеживается, и лично мне не странно, что оно работает. Хоть и нотисы сыпятся
Великолепно. Только ничего не понятно. Неужто трудно поместить внутрь тэга [ php ], чтобы подсветочка была, и отступы расставить? :-(
http://school87.kubannet.ru/pascal/6_3.html#632 http://www.yandex.ru/yandsearch?rpt=rad ... 1%E8%E2%E0
Та вот попробуй теперь найди, где это было ))) Вот оно. Нашел. http://php.ru/forum/viewtopic.php?t=142 ... c&start=50 Только там вместо $i-- нужно поставить $i-=2. И еще там указатель вылазит за границы массива. Но худо-бедно с нотисами работает ))) Походу, вероятно, автор реализовал алгоритм, известный под названием "Сортировка вставками". Только у него два цикла развернуто в один за счет возврата указателя, и лишние пробежки указателем по уже отсортированной части массива. http://algolist.manual.ru/sort/insert_sort.php