За последние 24 часа нас посетили 17824 программиста и 1642 робота. Сейчас ищут 1416 программистов ...

Как отсортировать массив

Тема в разделе "PHP для новичков", создана пользователем php), 10 мар 2015.

  1. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    Здравствуйте, я в пхп середничок, на днях меня попросили на собеседовании расписать принцип сортировки одномерного массива по значению, не используя встроенные функции(ksort, usort и т.д.). Стыдно признать, но я ничего толкового с ходу не смог сочинить :(

    Просьба профессионалов поделиться опытом: есть одномерный массив [3,2,45,67,12]. Как отсортировать его, не используя пользовательские функции ?
     
  2. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    методы сортировок очень много, можешь в инете поискать...
    Но, самый лучший, который я встречал еще в универские времена был Хоара ;)
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    самые простые(для понимания) и интуитивные решения "в лоб":

    -пробегаешься по массиву, ищешь максимальное. перекладываешь его в результирующий массив.
    далее все повторяется для оставшихся элементов. неэффективно зато железобетонно)

    - еще можно сравнивать соседние элементы, и менять местами если их взаимоположение противоречит условию сортировки. и т.д.

    вариантов можно придумать много. другое дело что все уже придумано , выбраны самые эффективные способы. написаны алгоритмы. поэтому писать свое нет смысла. получится много хуже.
     
  4. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Код (PHP):
    1. $array=[3,2,45,67,12];
    2. $count=sizeof($array);
    3. for($i=0;$i<$count;++$i) {
    4.     for($l=0;$l<$count-1;++$l) {
    5.         if($array[$l]>$array[$l+1]) {
    6.             $current=$array[$l];
    7.             $array[$l]=$array[$l+1];
    8.             $array[$l+1]=$current;
    9.         }
    10.     }
    11. }
    12. print_r($array); 
    Array
    (
    [0] => 2
    [1] => 3
    [2] => 12
    [3] => 45
    [4] => 67
    )
     
  5. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    Спасибо rognorog за оперативный ответ. На собеседовании я попытался проделать нечто похожее через цикл for. Но видно оперативки у меня не хватило :) Растерялся под пристальным взглядом профессионалов. Скажи, много времени тебе потребовалось? Хочу также уметь быстро придумывать решения.
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    php), это самый простой из алгоритмов сортировки, который обычно просто знают :) Их вообще до чёртика на самом деле
     
  7. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    php), 2 минуты =)
    Сначала хотел написать другое решение, потом подумал, на фиг время терять, написал тебе простой вариант.
    Для того, чтобы придумывать решения нужно понимать что ты пишешь.
    Можно было сделать и красивше, подумай над этим =)
    Задание тебе на дом ;)
    Включай фантазию, подставляй вывод и смотри как работает тот или иной скрипт.
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    вот возми его за основу, и начни улучшать.
    например сейчас, даже если передать УЖЕ отсортированный массив, все равно обо цикла отработают полностью. попытайся избавится от этого. это очень легко сделать.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Я больше скажу, его не знают, его 95% человек интуитивно воспроизводят, когда речь идет о сортировке-на-коленке. Это же "пузырек".
     
  10. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    rognorog извини, но я не совсем понял зачем нужно было обворачивать в двойной цикл? в одном цикле работает с тем-же результатом

    ....

    сорри, поторопился все правильно! Добавил еще значений и вышла путаница

    Добавлено спустя 51 минуту 6 секунд:
    Господа, меня все-же терзают кое-какие сомнения. Когда я начал решать задачу похожим образом, как rognorog, мне задали вопрос, после которого я впал в ступор, а что если значений будет миллион? В описанном примере идет двойной перебор массива, плюс еще присвоение значения к каждому идентификатору цикла, что конечно-же не может не откладывать отпечаток на производительности. Нельзя-ли решить задачу более оптимальным путем, может быть рекурсия подойдет?
     
  11. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    На пхпх, в обход стандартных средств и миллион записей? Да легко! Берешь поллитру, потом ещё и утром оно закончит сортировать ) По мне так ответ прост: "если вас интересует сортировка 1кк записей средствами php, то идите нахер лечиться".

    Тут либо используем нативные сортировки, либо сортировку БД, либо меняем язык. Остальное уже извращение.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    на самом деле хороший вопрос. еще про двоичный поиск хороший вопрос — его вообще почти никто не может написать сходу. почему про абстрактные фабрики спрашивают, а про сортировку и поиск нет? )))
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ессно, они увидели "пузырек" и сразу ударили в его больное место - нетерпимость больших объемов данных за счет роста итераций в количестве элементов массива в квадрате. На миллионе значений пузырек уйдет в астрал. По этой причине у нас есть множество алгоритмов сортировки! И у каждого свои плюсы и минусы. Они легко гуглятся. Есть даже видео, наглядно демонстрирующее их смысл. Вот, например, алгротим Шелла:



    Рекурсия - не волшебство, которое что-то там делает лучше, если ее добавить. Рекурсия - это инструмент для работы с древовидными структурами и алгоритмами. И да, рекурсия всегда дороже цикла. И да, любая рекурсия может быть приведена к циклу. Не факт, что малой кровью, но может.
     
  14. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    Красиво пишите, но как-то абстрактно все. Вроде задача простая, а никто кроме rognorog более-менее внятного примера не привел. Складывается вывод: либо вы абсолютно все знаете и умеете, но не хотите опускаться до такого уровня чтобы перед кем-то распинаться и приводить живой пример, либо наооборот... ну вы поняли о чем я.
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ох и ленивый нонче контингент пошел...
    ВОТ. Графа "сортировки". С готовыми решениями, в том числе на PHP.

    Тут дело какое, вы там с кем-то собеседуетесь, а не я.
     
  16. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    Нашел функцию на хабре: http://rsdn.ru/article/alg/sort.xml "Сортировка вставками"
    (Если чесс сказать даже не подозревал до этого дня, что алгоритмов сортировки существует аж целых 14).

    адаптировал ее под пхп:

    Код (Text):
    1.  
    2. $array=[545454545,3,2,1,67,234,876,124,776,9890];
    3. $count=sizeof($array);
    4.   // i определяет подсписок A[0]...A[i]
    5.   for ($i=1; $i<$count; $i++)
    6.   {
    7.     // индекс j пробегает вниз по списку от A[i] в процессе
    8.     // поиска правильной позиции вставляемого значения
    9.     $j = $i;
    10.     $temp = $array[$i];
    11.     // обнаружить подходящую позицию для вставки, сканируя подсписок,
    12.     // пока temp < A[j-1] или пока не встретится начало списка
    13.     while ($j > 0 && $temp < $array[$j-1])
    14.     {
    15.       // сдвинуть элементы вправо, чтобы освободить место для вставки
    16.       $array[$j] = $array[$j-1];
    17.       $j--;
    18.     }
    19.     // точка вставки найдена; вставить temp
    20.     $array[$j] = $temp;
    21.   }
    22.  
    23.   print_r($array);
    И все вроде работает как надо. Ну скажите, разве обычный человек может придумать такое за две-три минуты(время, которое мне отвели на тесте)?
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Может, если хотя бы поверхностно знает принцип ее работы. Тесты нужны для понимания вашей квалификации. Сортировки - это первый курс на профильных направлениях. Порой даже школьный. Вы не знали, что их много. Вы не смогли пройти тест. Ваша квалификация недостаточна. Тест работает.
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.797
    Симпатии:
    1.331
    Адрес:
    Лень
  19. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    Нашел для себя наиболее подходящее решение, метод "Быстрой сортировки":
    Код (Text):
    1.  
    2. function quicksort($array)
    3.     {
    4.         if (count($array) == 0)
    5.             return array();
    6.         $pivot = $array[0];
    7.         $left = $right = array();
    8.         for ($i = 1; $i < count($array); $i++) {
    9.             if ($array[$i] < $pivot)
    10.                 $left[] = $array[$i];
    11.             else
    12.                 $right[] = $array[$i];
    13.         }
    14.         return array_merge(quicksort($left), array($pivot), quicksort($right));
    15.     }
    16.     $sorted = quicksort($array);
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    QuickSort имеет смысл только для больших массивов, на небольших он превращается в SlowSort
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Но он же...квик...
    [​IMG]
     
  22. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    на какой уровень вы шли, на джуниора? какую ставку обещали?
    чистый интерес, не более.
    з.ы. тема хорошая, интересно почитать :)