2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469

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

25.01.2023, 11:30. Показов 4352. Ответов 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 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 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 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 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 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
26.01.2023, 14:14
Кстати, вот может будет интересной лекция по поводу алгоритмов сортировки
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
26.01.2023, 14:17  [ТС]
voral
Поспешил пример привести, такое решается флагом или отдельной функцией для натуральной сортировки... Но про объекты в силе
А про какой флаг вы говорили?
Вы сказали, что данную задачу можно решить еще каким-то флагом?
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 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 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 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 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 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
5515 / 1198 / 164
Регистрация: 16.01.2023
Сообщений: 2,851
26.01.2023, 14:59
G_manX, посмотрите этот плейлист на тему сортировок. Как они работают. Здесь несколько разных алгоритмов показаны, в том числе и bubble sort.
https://www.youtube.com/watch?... zB11snW7KQ
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 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 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 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
5515 / 1198 / 164
Регистрация: 16.01.2023
Сообщений: 2,851
26.01.2023, 15:36
Цитата Сообщение от G_manX Посмотреть сообщение
Тут просто стоит знак минус.
Попробуйте посчитать, что получается при разных значениях поля age
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru