За последние 24 часа нас посетили 40090 программистов и 2357 роботов. Сейчас ищут 1224 программиста ...

Своя функция сортировки чисел по возрастанию

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

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Сделал функцию, которая сортирует числа по возрастанию, только она получилась костыльная.

    Я не знаю, что сделать с элементом, который оказался самым маленьким и я ему присвоил новое значение, потом после всей сортировки, удалил его.

    Если бы я удалил элемент, который нашёлся, то есть самое меньшее число, то массив укоротился бы и тогда условие while, больше нормально не сработало

    PHP:
    1. $massiv = [3,2,5,1,7,4,6,8,9,10,13,11,14,12, -1,0];
    2.    
    3.     function minSort($arr, $newArr = []) {
    4.         $length = count($arr) - 1;
    5.        
    6.         while(count($newArr)-1 < $length) {
    7.    
    8.             for($i = 0; $i <= $length; $i++) {
    9.                 if($arr[$i] == min($arr)) {
    10.                     $newArr[] = $arr[$i];
    11.                     $arr[$i] = 99999999999;  
    12.                 }
    13.             }
    14.         }
    15.        
    16.         while($newArr[count($newArr) - 1] == 99999999999) {
    17.             unset($newArr[count($newArr) - 1]);
    18.         }
    19.        
    20.    
    21.         return $newArr;
    22.     }
    23.    
    24.     echo '<pre>';
    25.     print_r(minSort($massiv));
    26.     echo '</pre>';
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    посмотрите на функцию usort
    там это проще можно сделать..
     
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Если я буду использовать только готовые функции, то толком ничему не научусь
     
  4. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    если будете использовать нативные функции в нужных местах - то научитесь правильно писать код))
     
  5. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Если ты это делаешь в плане обучения,тогда попробуй реализовать QuickSort
    https://ru.wikipedia.org/wiki/Быстрая_сортировка
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Обычно сортируют без создания нового массива, и используют один из алгоритмов перестановок. QuickSort - это как финальный аккорд, а по началу лучше какой-нибудь пузырёк реализовать
     
  7. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    как вы это все помните)) эти методы)) пузырьковые) я только названия помню - да и то как то смутно)
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну я писал пузырёк. И не только его. Но я не так много и помню :) Кнута я в своё время не осилил
     
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Я не понимаю, почему, если в условие while вместо count($arr) написать $length, то будет бесконечный цикл?
    Ведь это же тоже самое

    PHP:
    1. $arr = [3,1,2,5,4];
    2.  
    3. $arr2 = [];
    4.  
    5. $length = count($arr);
    6.  
    7. while($length) {
    8.     foreach($arr as $k => $v) {
    9.         if($v == min($arr)) {
    10.             $arr2[] = $v;
    11.             unset($arr[$k]);
    12.         }
    13.     }
    14. }
    15.  
    16. echo '<pre>';
    17. print_r($arr2);
    18. echo '</pre>';
     
  10. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Потому что получится:
    PHP:
    1. while(true){
    2.  
    3.   //code
    4. }
     
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А если логику включить? count($arr) считает количество элементов в массиве сейчас, поэтому если внутри цикла оно меняется, то при каждой проверке условия count будет разный. Если же ты до начала цикла записываешь количество элементов в массиве в переменную $length, то она будет хранить его, пока ты не изменишь именно её, а с количество элементов массива она больше прямой связи не имеет
     
  12. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Пытаюсь переделать foreach, на обычный for, сортируется но выскакивает много ошибок, как исправить?

    PHP:
    1. $arr = [3,1,2,5,4,0];
    2.  
    3. $arr2 = [];
    4.  
    5. $len = count($arr);
    6.  
    7.  
    8. while(count($arr)) {
    9.     for($i = 0; $i < $len; $i++) {
    10.         if($arr[$i] == min($arr)) {
    11.             $arr2[] = $arr[$i];
    12.             unset($arr[$i]);
    13.         }  
    14.     }
    15. }
    16.  
    17. echo '<pre>'; print_r($arr); echo '</pre>';
    18.  
    19. echo '<pre>'; print_r($arr2); echo '</pre>';