Здравствуйте, я в пхп середничок, на днях меня попросили на собеседовании расписать принцип сортировки одномерного массива по значению, не используя встроенные функции(ksort, usort и т.д.). Стыдно признать, но я ничего толкового с ходу не смог сочинить Просьба профессионалов поделиться опытом: есть одномерный массив [3,2,45,67,12]. Как отсортировать его, не используя пользовательские функции ?
методы сортировок очень много, можешь в инете поискать... Но, самый лучший, который я встречал еще в универские времена был Хоара
самые простые(для понимания) и интуитивные решения "в лоб": -пробегаешься по массиву, ищешь максимальное. перекладываешь его в результирующий массив. далее все повторяется для оставшихся элементов. неэффективно зато железобетонно) - еще можно сравнивать соседние элементы, и менять местами если их взаимоположение противоречит условию сортировки. и т.д. вариантов можно придумать много. другое дело что все уже придумано , выбраны самые эффективные способы. написаны алгоритмы. поэтому писать свое нет смысла. получится много хуже.
Код (PHP): $array=[3,2,45,67,12]; $count=sizeof($array); for($i=0;$i<$count;++$i) { for($l=0;$l<$count-1;++$l) { if($array[$l]>$array[$l+1]) { $current=$array[$l]; $array[$l]=$array[$l+1]; $array[$l+1]=$current; } } } print_r($array); Array ( [0] => 2 [1] => 3 [2] => 12 [3] => 45 [4] => 67 )
Спасибо rognorog за оперативный ответ. На собеседовании я попытался проделать нечто похожее через цикл for. Но видно оперативки у меня не хватило Растерялся под пристальным взглядом профессионалов. Скажи, много времени тебе потребовалось? Хочу также уметь быстро придумывать решения.
php), это самый простой из алгоритмов сортировки, который обычно просто знают Их вообще до чёртика на самом деле
php), 2 минуты =) Сначала хотел написать другое решение, потом подумал, на фиг время терять, написал тебе простой вариант. Для того, чтобы придумывать решения нужно понимать что ты пишешь. Можно было сделать и красивше, подумай над этим =) Задание тебе на дом Включай фантазию, подставляй вывод и смотри как работает тот или иной скрипт.
вот возми его за основу, и начни улучшать. например сейчас, даже если передать УЖЕ отсортированный массив, все равно обо цикла отработают полностью. попытайся избавится от этого. это очень легко сделать.
Я больше скажу, его не знают, его 95% человек интуитивно воспроизводят, когда речь идет о сортировке-на-коленке. Это же "пузырек".
rognorog извини, но я не совсем понял зачем нужно было обворачивать в двойной цикл? в одном цикле работает с тем-же результатом .... сорри, поторопился все правильно! Добавил еще значений и вышла путаница Добавлено спустя 51 минуту 6 секунд: Господа, меня все-же терзают кое-какие сомнения. Когда я начал решать задачу похожим образом, как rognorog, мне задали вопрос, после которого я впал в ступор, а что если значений будет миллион? В описанном примере идет двойной перебор массива, плюс еще присвоение значения к каждому идентификатору цикла, что конечно-же не может не откладывать отпечаток на производительности. Нельзя-ли решить задачу более оптимальным путем, может быть рекурсия подойдет?
На пхпх, в обход стандартных средств и миллион записей? Да легко! Берешь поллитру, потом ещё и утром оно закончит сортировать ) По мне так ответ прост: "если вас интересует сортировка 1кк записей средствами php, то идите нахер лечиться". Тут либо используем нативные сортировки, либо сортировку БД, либо меняем язык. Остальное уже извращение.
на самом деле хороший вопрос. еще про двоичный поиск хороший вопрос — его вообще почти никто не может написать сходу. почему про абстрактные фабрики спрашивают, а про сортировку и поиск нет? )))
Ессно, они увидели "пузырек" и сразу ударили в его больное место - нетерпимость больших объемов данных за счет роста итераций в количестве элементов массива в квадрате. На миллионе значений пузырек уйдет в астрал. По этой причине у нас есть множество алгоритмов сортировки! И у каждого свои плюсы и минусы. Они легко гуглятся. Есть даже видео, наглядно демонстрирующее их смысл. Вот, например, алгротим Шелла: Рекурсия - не волшебство, которое что-то там делает лучше, если ее добавить. Рекурсия - это инструмент для работы с древовидными структурами и алгоритмами. И да, рекурсия всегда дороже цикла. И да, любая рекурсия может быть приведена к циклу. Не факт, что малой кровью, но может.
Красиво пишите, но как-то абстрактно все. Вроде задача простая, а никто кроме rognorog более-менее внятного примера не привел. Складывается вывод: либо вы абсолютно все знаете и умеете, но не хотите опускаться до такого уровня чтобы перед кем-то распинаться и приводить живой пример, либо наооборот... ну вы поняли о чем я.
Ох и ленивый нонче контингент пошел... ВОТ. Графа "сортировки". С готовыми решениями, в том числе на PHP. Тут дело какое, вы там с кем-то собеседуетесь, а не я.
Нашел функцию на хабре: http://rsdn.ru/article/alg/sort.xml "Сортировка вставками" (Если чесс сказать даже не подозревал до этого дня, что алгоритмов сортировки существует аж целых 14). адаптировал ее под пхп: Код (Text): $array=[545454545,3,2,1,67,234,876,124,776,9890]; $count=sizeof($array); // i определяет подсписок A[0]...A[i] for ($i=1; $i<$count; $i++) { // индекс j пробегает вниз по списку от A[i] в процессе // поиска правильной позиции вставляемого значения $j = $i; $temp = $array[$i]; // обнаружить подходящую позицию для вставки, сканируя подсписок, // пока temp < A[j-1] или пока не встретится начало списка while ($j > 0 && $temp < $array[$j-1]) { // сдвинуть элементы вправо, чтобы освободить место для вставки $array[$j] = $array[$j-1]; $j--; } // точка вставки найдена; вставить temp $array[$j] = $temp; } print_r($array); И все вроде работает как надо. Ну скажите, разве обычный человек может придумать такое за две-три минуты(время, которое мне отвели на тесте)?
Может, если хотя бы поверхностно знает принцип ее работы. Тесты нужны для понимания вашей квалификации. Сортировки - это первый курс на профильных направлениях. Порой даже школьный. Вы не знали, что их много. Вы не смогли пройти тест. Ваша квалификация недостаточна. Тест работает.
http://sevidi.ru/phpstroy/phpstroy23.php Добавлено спустя 24 минуты 19 секунд: говори этим професорам *Я есть ГруууДД* )))
Нашел для себя наиболее подходящее решение, метод "Быстрой сортировки": Код (Text): function quicksort($array) { if (count($array) == 0) return array(); $pivot = $array[0]; $left = $right = array(); for ($i = 1; $i < count($array); $i++) { if ($array[$i] < $pivot) $left[] = $array[$i]; else $right[] = $array[$i]; } return array_merge(quicksort($left), array($pivot), quicksort($right)); } $sorted = quicksort($array);
на какой уровень вы шли, на джуниора? какую ставку обещали? чистый интерес, не более. з.ы. тема хорошая, интересно почитать