Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469

Зачем нужна сортировка пузырьком?

25.01.2023, 11:30. Показов 4341. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Надыбал код в инете, который был реализован при помощи алгоритма bubble sort
Как я понимаю, данный код сортирует массив по возрастанию.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function bubble_sort(&$array){
 
 
for ($i=0; $i < count($array); $i++){
 
for ($y=($i+1); $y < count($array); $y++){
 
if ($array[$i] > $array[$y]){
$c = $array[$i];
$array[$i] = $array[$y];
$array[$y] = $c;
}}}}
 
 
$arr = array(92, 64, 87, 18, 17, 66, 50, 88, 99, 77);
bubble_sort($arr);
 
foreach($arr as $items){
echo $items."<br>";
}
Но зачем писать этот сложный алгоритм, когда можно сделать как в коде ниже
и результат будет тот же. Объясните пожалуйста, может я нуб и не понимаю чего-то?
PHP
1
2
3
4
5
6
$arr = array(92, 64, 87, 18, 17, 66, 50, 88, 99, 77);
asort($arr);
 
foreach($arr as $items){
echo $items."<br>";
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.01.2023, 11:30
Ответы с готовыми решениями:

Не работает сортировка пузырьком
Здравствуйте. У меня возникла проблема с сортировкой. Вот задание: Найти сумму всех элементов в столбцах, сортировать элементы в...

Сортировка пузырьком. Зачем нужно 2 цикла?
for(int j=1;j&lt;=k;j++) for(int i=1;i&lt;=k;i++) if(A&lt;A) { max=A; A=A; A=max; ...

Сортировка пузырьком, нужна подсказка
Здравствуйте! Начинающий программист, пытаюсь введенную строку слов сортировать по длине методом пузырька. Не могу понять, в каком месте...

43
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
26.01.2023, 14:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от G_manX Посмотреть сообщение
Как по этим возвращаемым числам функция принимает решение вывести пару $a и $b значений?
Для примера вот вам ваша фукнция сортировки пузырьком и ее аналог где решение о "больше/меньше" принимает функция принимаемая параметром

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function bubble_sort(&$array)
{
    for ($i = 0; $i < count($array); $i++) {
        for ($y = ($i + 1); $y < count($array); $y++) {
            if ($array[$i] > $array[$y]) {
                $c = $array[$i];
                $array[$i] = $array[$y];
                $array[$y] = $c;
            }
        }
    }
}
 
function bubble_sort_managed(array &$array, callable $cmpFunction): void
{
    for ($i = 0; $i < count($array); $i++) {
        for ($y = ($i + 1); $y < count($array); $y++) {
            if ($cmpFunction($array[$i], $array[$y]) > 0) {
                $c = $array[$i];
                $array[$i] = $array[$y];
                $array[$y] = $c;
            }
        }
    }
}
0
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
26.01.2023, 14:07  [ТС]
voral
Ясно, значит эту мини-callback функцию для uasort вырезали из исходника PHP,
чтобы пользователь смог изменять вывод сортировки под себя.
а основой алгоритм сортировки лежит в самом исходнике PHP, верно ли я понимаю?

Чтобы понять как работает основной алгоритм сортировки, то придется копаться в исходниках PHP?
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
26.01.2023, 14:08
Теперь аналог вашей функции отсортирует "пузырьком" тех самых котов с помощью функции compareCats
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
26.01.2023, 14:14  [ТС]
voral
Значит эту мини-callback функцию:
PHP
1
2
3
4
5
6
function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}
для uasort вырезали из исходника PHP,
чтобы пользователь смог изменять вывод сортировки под себя.

А основой алгоритм сортировки лежит в самом исходнике PHP, верно ли я понимаю?
Чтобы понять как работает основной алгоритм сортировки(работа по возвращаемым значениям 0,-1,1),
то придется копаться в исходниках PHP?
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
26.01.2023, 14:14
Кстати, вот может будет интересной лекция по поводу алгоритмов сортировки
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
26.01.2023, 14:17  [ТС]
voral
Поспешил пример привести, такое решается флагом или отдельной функцией для натуральной сортировки... Но про объекты в силе
А про какой флаг вы говорили?
Вы сказали, что данную задачу можно решить еще каким-то флагом?
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
26.01.2023, 14:19
Цитата Сообщение от G_manX Посмотреть сообщение
для uasort вырезали из исходника PHP,
Я в исходники не заглядывал Возможно. Но она там на Си
Цитата Сообщение от G_manX Посмотреть сообщение
чтобы пользователь смог изменять вывод сортировки под себя
Чтобы разработчик мог установить свой алгоритм сравнения ( не путать с алгоритмом сортировки)


Цитата Сообщение от G_manX Посмотреть сообщение
чтобы понять как работает основной алгоритм сортировки(работа по возвращаемым значениям 0,-1,1),
В общем случае да. А так мой пример с вашей функцией выше это демонстрирует (просто в нем "интересен" только вариант когда "больше"....

Добавлено через 2 минуты
Цитата Сообщение от G_manX Посмотреть сообщение
А про какой флаг вы говорили?
Вы сказали, что данную задачу можно решить еще каким-то флагом?
Учитесь работать с докой. В данном случае дока по функции asort говорит что у функции есть второй параметр.. В котором можно передать флаги. в частности SORT_NATURAL
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
26.01.2023, 14:25  [ТС]
voral
Флаг не помог =(
Ошибка =(

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Cat
{
    private $id;
    private $name;
    private $color;
 
    public function __construct($name, $color)
    {
        $this->id = random_int(1,400);
        $this->name = $name;
        $this->color = $color;
    }
 
    public function showInfo()
    {
        echo "{$this->id} Имя {$this->name}, окрас {$this->color}<br>" . PHP_EOL;
    }
}
 
$pets[] = new Cat('Мурзик', 'белый');
$pets[] = new Cat('Барсик', 'серый');
$pets[] = new Cat('Василий', 'полосатый');
 
asort($pets, SORT_NATURAL); // ошибочка вышла =(
 
foreach ($pets as $pet) {
  $pet->showInfo();
}
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
26.01.2023, 14:27
Ам... а при чем тут это флаг?
флаг был к примеру

PHP
1
2
3
4
// имеем
$a = ['10apple','2apple','1apple'];
// хочу
$a = ['1apple','2apple','10apple'];
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
26.01.2023, 14:38  [ТС]
voral
Значит, в случае с классами остается только вариант с uasort?
PHP
1
2
3
4
5
6
7
function compareCats(Cat $a, Cat $b):int {
    if ($a->getName() === $b->getName()) {
        return 0;
    }
    return ($a->getName() < $b->getName()) ? -1 : 1;
}
uasort($pets, 'compareCats');
Я весь инет прошерстил и везде этот алгоритм одинаковый,
разница лишь в условии if и в условии тернарника:

$a->getName(), если это класс,
а если массив могут и $a["name"]
а так все одинаково. Это что стандарт какой-то?
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
26.01.2023, 14:49
Цитата Сообщение от G_manX Посмотреть сообщение
Я весь инет прошерстил и везде этот алгоритм одинаковый,
разница лишь в условии if и в условии тернарника:
Цитата Сообщение от G_manX Посмотреть сообщение
Это что стандарт какой-то?
Ну а чего там еще может быть? Вам нужно сравнить две сущности по нужным вам критериям (их может быть и 100) и выдать один из трех вариантов. Единственное для числовых значений можно "упростить"


PHP
1
2
3
function compareCatsByAge(Cat $a, Cat $b):int {
    return $a->getAge() - $b->getAge();
}
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
26.01.2023, 14:52  [ТС]
voral
Если в массиве 11 элементов,
то callback функция compareCats для uasort выполнится 5 раз?
Так как, за один раз данная callback функция в качестве аргументов принимает два элемента массива
и так пока все элементы массива не пройдут через аргументы callback функций, верно ли?
0
 Аватар для sad67man
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
26.01.2023, 14:59
Цитата Сообщение от G_manX Посмотреть сообщение
В инете не могу найти подробное описание работы функции uasort,
Еще раз. Читайте usort

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.
Для этого даже есть специальный оператор <=>, который добавили в 7-ой версии php


PHP
1
2
3
function cmp($a, $b) {
    return $a <=> $b;
}
0
Эксперт PHP
 Аватар для liris
5512 / 1195 / 164
Регистрация: 16.01.2023
Сообщений: 2,841
26.01.2023, 14:59
G_manX, посмотрите этот плейлист на тему сортировок. Как они работают. Здесь несколько разных алгоритмов показаны, в том числе и bubble sort.
https://www.youtube.com/watch?... zB11snW7KQ
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
26.01.2023, 15:02
Цитата Сообщение от G_manX Посмотреть сообщение
то callback функция compareCats для uasort выполнится 5 раз?
Зависит от алгоритма сортировки. Достоверно я не знаю какой там реализован
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
26.01.2023, 15:32  [ТС]
sad67man
Для этого даже есть специальный оператор <=>, который добавили в 7-ой версии php
Ну этот оператор <=>,
не подойдет в моем случае

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Cat
{
    private $id;
    private $name;
    private $color;
 
    public function __construct($name, $color)
    {
        $this->id = random_int(1,400);
        $this->name = $name;
        $this->color = $color;
    }
 
  function getName(){
  return $this->name;
  }
 
    public function showInfo()
    {
        echo "{$this->id} Имя {$this->name}, окрас {$this->color}<br>" . PHP_EOL;
    }
}
 
$pets[] = new Cat('Мурзик', 'белый');
$pets[] = new Cat('Барсик', 'серый');
$pets[] = new Cat('Василий', 'полосатый');
 
function compareCats(Cat $a, Cat $b):int {
    if ($a->getName() === $b->getName()) {   // как вы сюда вставите оператор <=> ?
        return 0;
    }
    return ($a->getName() < $b->getName()) ? -1 : 1;
}
uasort($pets, 'compareCats');
 
foreach ($pets as $pet) {
  $pet->showInfo();
}
Добавлено через 6 минут
voral
PHP
1
2
3
function compareCatsByAge(Cat $a, Cat $b):int {
    return $a->getAge() - $b->getAge();
}
Не понял?
А где три значения: 0, -1, 1 ?
Вы же сами сказали, что callback функция для uasort должна возвращать одно из трех значений?
А тут что получается, вернуть $a-лет минус $b-лет ?

Добавлено через 10 минут
Ёкарный бабай мужики, вот что за магия вышла.
Заменил этот длинный код:
PHP
1
2
3
4
5
6
7
function compareCats(Cat $a, Cat $b):int {
    if ($a->getName() === $b->getName()) {  
        return 0;
    }
    return ($a->getName() < $b->getName()) ? -1 : 1;
}
uasort($pets, 'compareCats');
на:
PHP
1
2
3
4
5
function compareCats(Cat $a, Cat $b):int {
return $a->getName() <=> $b->getName();
}
 
uasort($pets, 'compareCats');
И результат тот же.
Хотя callback функция должна возвращать одно из трех значений(0,-1,1) для функции uasort,
но и без этого работает. Вот это чудеса.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
26.01.2023, 15:34
Цитата Сообщение от G_manX Посмотреть сообщение
Вы же сами сказали, что callback функция для uasort должна возвращать одно из трех значений?
Строго говоря отрицательное значение, 0 и положительное значение

Добавлено через 49 секунд
Это не магия. Это развитие языка.
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
26.01.2023, 15:34  [ТС]
voral
А где три значения: 0, -1, 1 ?
Здесь:
PHP
1
2
3
function compareCatsByAge(Cat $a, Cat $b):int {
    return $a->getAge() - $b->getAge();
}
Тут просто стоит знак минус.
0
Эксперт PHP
 Аватар для liris
5512 / 1195 / 164
Регистрация: 16.01.2023
Сообщений: 2,841
26.01.2023, 15:36
Цитата Сообщение от G_manX Посмотреть сообщение
Тут просто стоит знак минус.
Попробуйте посчитать, что получается при разных значениях поля age
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
26.01.2023, 15:36
Цитата Сообщение от G_manX Посмотреть сообщение
А где три значения: 0, -1, 1 ?
Выше же написал: отрицательное, 0 и положительное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.01.2023, 15:36

Сортировка списка перемешиванием по убыванию (шейкерная сортировка или двунаправленнная сортировка пузырьком)
Помогите написать функцию сортировки списка перемешиванием по убыванию (шейкерная сортировка или двунаправленнная сортировка пузырьком). ...

Блок схема.Сортировка «Пузырьком», Сортировка методом «Последовательных перестановок», Сортировка «Вставками»
Помогите, нужны блок схемы Сортировка «Вставками» Program Vstavka; uses dos; Type mass=array of integer; Var i,b,n,j,a:...

Сортировка пузырьком и пирамидальная сортировка заданного массива + бинарный поиск
Заполнить случайным образом одномерный массив размера N и выполнить сортировку пузырьком и пирамидальную сортировку заданного массива. В...

Зачем нужна конвертация чисел в текст (TO_CHAR) и текст в число (TO_NUMBER). Так же зачем нужен оператор NULLIF?
Описывают как очень удобные функции, только я как видел то что было число 193, так оно и осталось 193, только СУБД эти числа видит как...

Сортировка пузырьком или сортировка вставками
Реализовать функцию, принимает массив и сортирует его (нельзя использовать встроенные методы сортировки). Самые простые реализации...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru