Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
basics_of_algorithms:sorting_algorithms [2023/10/04 21:57] werwolf [Принцип работы быстрой сортировки] |
basics_of_algorithms:sorting_algorithms [2023/10/04 22:18] (текущий) werwolf [Универсальная функция сортировки] |
||
|---|---|---|---|
| Строка 532: | Строка 532: | ||
| Попробуем реализовать алгоритм на JavaScript. Начнем с функции частичного упорядочивания: | Попробуем реализовать алгоритм на JavaScript. Начнем с функции частичного упорядочивания: | ||
| - | <code> | + | <code javascript> |
| const partition = (items, left, right, pivot) => { | const partition = (items, left, right, pivot) => { | ||
| while (true) { | while (true) { | ||
| Строка 557: | Строка 557: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| def partition(items, left, right, pivot): | def partition(items, left, right, pivot): | ||
| while True: | while True: | ||
| Строка 575: | Строка 576: | ||
| right -= 1 | right -= 1 | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 605: | Строка 608: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| class App { | class App { | ||
| public static int partition(int[] items, int left, int right, int pivot) { | public static int partition(int[] items, int left, int right, int pivot) { | ||
| Строка 634: | Строка 639: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| В качестве параметров функция получает: | В качестве параметров функция получает: | ||
| Строка 643: | Строка 649: | ||
| Сначала в цикле пропускаются элементы слева, которые меньше опорного: | Сначала в цикле пропускаются элементы слева, которые меньше опорного: | ||
| - | <code> | + | <code javascript> |
| while (items[left] < pivot) { | while (items[left] < pivot) { | ||
| left += 1; | left += 1; | ||
| Строка 649: | Строка 655: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| while items[left] < pivot: | while items[left] < pivot: | ||
| left += 1 | left += 1 | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 665: | Строка 674: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| while (items[left] < pivot) { | while (items[left] < pivot) { | ||
| left++; | left++; | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| Затем пропускаются элементы справа, которые больше опорного: | Затем пропускаются элементы справа, которые больше опорного: | ||
| - | <code> | + | <code javascript> |
| while (items[right] > pivot) { | while (items[right] > pivot) { | ||
| right -= 1; | right -= 1; | ||
| Строка 682: | Строка 694: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| while items[right] > pivot: | while items[right] > pivot: | ||
| right -= 1 | right -= 1 | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 698: | Строка 713: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| while (items[right] > pivot) { | while (items[right] > pivot) { | ||
| right--; | right--; | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| Если указатели встретились или зашли друг за друга, мы завершаем цикл и возвращаем место встречи в качестве результата. Нам предстоит разбить массив на два подмассива, поэтому надо решить, что именно возвращать. Мы можем сказать, что граница — это место, где заканчивается левый подмассив, или место, где начинается правый. Большой разницы здесь нет. | Если указатели встретились или зашли друг за друга, мы завершаем цикл и возвращаем место встречи в качестве результата. Нам предстоит разбить массив на два подмассива, поэтому надо решить, что именно возвращать. Мы можем сказать, что граница — это место, где заканчивается левый подмассив, или место, где начинается правый. Большой разницы здесь нет. | ||
| Строка 711: | Строка 729: | ||
| Решим, что функция ''partition'' возвращает индекс элемента, где начинается правый подмассив: | Решим, что функция ''partition'' возвращает индекс элемента, где начинается правый подмассив: | ||
| - | <code> | + | <code javascript> |
| if (left >= right) { | if (left >= right) { | ||
| return right + 1; | return right + 1; | ||
| Строка 717: | Строка 735: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| if left >= right: | if left >= right: | ||
| return right + 1 | return right + 1 | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 733: | Строка 754: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| if (left >= right) { | if (left >= right) { | ||
| return right + 1; | return right + 1; | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| Если указатели остановились, то они указывают на два элемента в неверном порядке. Левый указатель смотрит на элемент, который больше опорного. При этом правый указатель смотрит на элемент, который меньше опорного. | Если указатели остановились, то они указывают на два элемента в неверном порядке. Левый указатель смотрит на элемент, который больше опорного. При этом правый указатель смотрит на элемент, который меньше опорного. | ||
| Строка 746: | Строка 770: | ||
| Меняем местами и сдвигаем элементы, чтобы в следующей итерации продолжить поиск следующей неправильной пары: | Меняем местами и сдвигаем элементы, чтобы в следующей итерации продолжить поиск следующей неправильной пары: | ||
| - | <code> | + | <code java> |
| const temporary = items[left]; | const temporary = items[left]; | ||
| items[left] = items[right]; | items[left] = items[right]; | ||
| Строка 755: | Строка 779: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| items[left], items[right] = items[right], items[left] | items[left], items[right] = items[right], items[left] | ||
| left += 1 | left += 1 | ||
| right -= 1 | right -= 1 | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 775: | Строка 802: | ||
| $right -= 1; | $right -= 1; | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| var temporary = items[left]; | var temporary = items[left]; | ||
| items[left] = items[right]; | items[left] = items[right]; | ||
| items[right] = temporary; | items[right] = temporary; | ||
| </code> | </code> | ||
| + | </details> | ||
| Обычно условие завершения цикла пишут в начале (оператор ''while'') или в конце (оператор ''do…while''). В функции ''partition()'' условие становится известно в середине цикла. | Обычно условие завершения цикла пишут в начале (оператор ''while'') или в конце (оператор ''do…while''). В функции ''partition()'' условие становится известно в середине цикла. | ||
| Строка 788: | Строка 818: | ||
| В языках программирования нет специального синтаксиса для такой ситуации. Обычно программисты записывают бесконечный цикл с помощью конструкции ''while (true)'', а выход из цикла делают с помощью операторов ''break'' или ''return'': | В языках программирования нет специального синтаксиса для такой ситуации. Обычно программисты записывают бесконечный цикл с помощью конструкции ''while (true)'', а выход из цикла делают с помощью операторов ''break'' или ''return'': | ||
| - | <code> | + | <code javascript> |
| while (true) { | while (true) { | ||
| // ... | // ... | ||
| Строка 800: | Строка 830: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| <code> | <code> | ||
| Строка 811: | Строка 842: | ||
| # ... | # ... | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 827: | Строка 860: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| while (true) { | while (true) { | ||
| // ... | // ... | ||
| Строка 841: | Строка 876: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| Частично упорядоченный массив нельзя назвать полностью отсортированным. Чтобы закончить сортировку, мы должны рекурсивно повторить упорядочивание для левой и правой половин массива. | Частично упорядоченный массив нельзя назвать полностью отсортированным. Чтобы закончить сортировку, мы должны рекурсивно повторить упорядочивание для левой и правой половин массива. | ||
| Строка 846: | Строка 882: | ||
| Про рекурсию мы говорили на прошлом уроке. Так выглядит рекурсивный алгоритм быстрой сортировки. Он немного похож на рекурсивную функцию бинарного поиска: | Про рекурсию мы говорили на прошлом уроке. Так выглядит рекурсивный алгоритм быстрой сортировки. Он немного похож на рекурсивную функцию бинарного поиска: | ||
| - | <code> | + | <code javascript> |
| const sort = (items, left, right) => { | const sort = (items, left, right) => { | ||
| const length = right - left + 1; | const length = right - left + 1; | ||
| Строка 862: | Строка 898: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| <code> | <code> | ||
| Строка 876: | Строка 913: | ||
| sort(items, split_index, right) | sort(items, split_index, right) | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 897: | Строка 936: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| class App { | class App { | ||
| public static int partition(int[] items, int left, int right, int pivot) { | public static int partition(int[] items, int left, int right, int pivot) { | ||
| Строка 921: | Строка 962: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| Для упорядочивания нужно не менее двух элементов. Поэтому мы остановим рекурсивный вызов, когда встретим пустой подмассив или подмассив с одним элементом: | Для упорядочивания нужно не менее двух элементов. Поэтому мы остановим рекурсивный вызов, когда встретим пустой подмассив или подмассив с одним элементом: | ||
| - | <code> | + | <code javascript> |
| const length = right - left + 1; | const length = right - left + 1; | ||
| Строка 941: | Строка 983: | ||
| </code> | </code> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 952: | Строка 995: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| var length = right - left + 1; | var length = right - left + 1; | ||
| Строка 962: | Строка 1007: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| Функция ''partition'' возвращает индекс первого элемента в правом подмассиве. Это помогает функции ''sort'' корректно вызвать саму себя: | Функция ''partition'' возвращает индекс первого элемента в правом подмассиве. Это помогает функции ''sort'' корректно вызвать саму себя: | ||
| - | <code> | + | <code javascript> |
| const splitIndex = partition(items, left, right, pivot); | const splitIndex = partition(items, left, right, pivot); | ||
| sort(items, left, splitIndex - 1); | sort(items, left, splitIndex - 1); | ||
| Строка 971: | Строка 1017: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| split_index = partition(items, left, right, pivot) | split_index = partition(items, left, right, pivot) | ||
| sort(items, left, split_index - 1) | sort(items, left, split_index - 1) | ||
| sort(items, split_index, right) | sort(items, split_index, right) | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 988: | Строка 1037: | ||
| sort($items, $splitIndex, $right); | sort($items, $splitIndex, $right); | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| var splitIndex = partition(items, left, right, pivot); | var splitIndex = partition(items, left, right, pivot); | ||
| sort(items, left, splitIndex - 1); | sort(items, left, splitIndex - 1); | ||
| sort(items, splitIndex, right); | sort(items, splitIndex, right); | ||
| </code> | </code> | ||
| + | </details> | ||
| Единственный код, который вызывает вопросы — выбор опорного элемента: | Единственный код, который вызывает вопросы — выбор опорного элемента: | ||
| - | <code> | + | <code javascript> |
| const pivot = items[left]; | const pivot = items[left]; | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| pivot = items[left] | pivot = items[left] | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| $pivot = $items[$left]; | $pivot = $items[$left]; | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| var pivot = items[left]; | var pivot = items[left]; | ||
| </code> | </code> | ||
| + | </details> | ||
| Почему мы всегда выбираем самый левый элемент подмассива? | Почему мы всегда выбираем самый левый элемент подмассива? | ||
| Строка 1035: | Строка 1093: | ||
| Чтобы упростить себе жизнь, напишем вспомогательную функцию, которая всегда сортирует массив целиком: | Чтобы упростить себе жизнь, напишем вспомогательную функцию, которая всегда сортирует массив целиком: | ||
| - | <code> | + | <code javascript> |
| const quicksort = (items) => sort(items, 0, items.length - 1); | const quicksort = (items) => sort(items, 0, items.length - 1); | ||
| Строка 1043: | Строка 1101: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| def quicksort(items): | def quicksort(items): | ||
| sort(items, 0, len(items) - 1) | sort(items, 0, len(items) - 1) | ||
| Строка 1053: | Строка 1112: | ||
| print(items) # => [10, 24, 34, 43, 52, 55, 57, 93, 99] | print(items) # => [10, 24, 34, 43, 52, 55, 57, 93, 99] | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 1068: | Строка 1129: | ||
| print_r($items); // => [ 10, 24, 34, 43, 52, 55, 57, 93, 99 ] | print_r($items); // => [ 10, 24, 34, 43, 52, 55, 57, 93, 99 ] | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| class App { | class App { | ||
| Строка 1086: | Строка 1149: | ||
| // => [ 10, 24, 34, 43, 52, 55, 57, 93, 99 ] | // => [ 10, 24, 34, 43, 52, 55, 57, 93, 99 ] | ||
| </code> | </code> | ||
| + | </details> | ||
| Быстрая сортировка намного эффективнее сортировки выбором. Причем эта разница особенно видна на больших массивах. Если сортировать миллион элементов, сортировка выбором окажется медленнее в десятки тысяч раз. | Быстрая сортировка намного эффективнее сортировки выбором. Причем эта разница особенно видна на больших массивах. Если сортировать миллион элементов, сортировка выбором окажется медленнее в десятки тысяч раз. | ||
| Строка 1101: | Строка 1165: | ||
| Сам массив выглядит так: | Сам массив выглядит так: | ||
| - | <code> | + | <code javascript> |
| const products = [ | const products = [ | ||
| { name: "Телевизор", price: 100000, rating: 9.1 }, | { name: "Телевизор", price: 100000, rating: 9.1 }, | ||
| Строка 1115: | Строка 1179: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| products = [ | products = [ | ||
| {"name": "Телевизор", "price": 100000, "rating": 9.1}, | {"name": "Телевизор", "price": 100000, "rating": 9.1}, | ||
| Строка 1130: | Строка 1195: | ||
| ] | ] | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 1148: | Строка 1215: | ||
| ]; | ]; | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| Map[] products = { | Map[] products = { | ||
| Map.of ("name", "Телевизор", "price", 100000, "rating", 9.1), | Map.of ("name", "Телевизор", "price", 100000, "rating", 9.1), | ||
| Строка 1164: | Строка 1233: | ||
| }; | }; | ||
| </code> | </code> | ||
| + | </details> | ||
| Можно реализовать несколько функций сортировки, но есть и более эффективный способ. Интернет-магазину подойдет **универсальная функция сортировки**. | Можно реализовать несколько функций сортировки, но есть и более эффективный способ. Интернет-магазину подойдет **универсальная функция сортировки**. | ||
| Строка 1173: | Строка 1243: | ||
| Вот так будет выглядеть компаратор, сравнивающий элементы по цене: | Вот так будет выглядеть компаратор, сравнивающий элементы по цене: | ||
| - | <code> | + | <code javascript> |
| const compareByPrice = (item1, item2) => { | const compareByPrice = (item1, item2) => { | ||
| if (item1.price < item2.price) { | if (item1.price < item2.price) { | ||
| Строка 1185: | Строка 1255: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| def compare_by_price(item1, item2): | def compare_by_price(item1, item2): | ||
| if item1[price] < item2[price]: | if item1[price] < item2[price]: | ||
| Строка 1196: | Строка 1267: | ||
| return 1 | return 1 | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 1213: | Строка 1286: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| public static ToIntBiFunction<Map<String, Object>, Map<String, Object>> compareByPrice = (item1, item2) -> { | public static ToIntBiFunction<Map<String, Object>, Map<String, Object>> compareByPrice = (item1, item2) -> { | ||
| var price1 = (int) item1.get("price"); | var price1 = (int) item1.get("price"); | ||
| Строка 1230: | Строка 1305: | ||
| }; | }; | ||
| </code> | </code> | ||
| + | </details> | ||
| А вот так — компаратор, сравнивающий элементы по рейтингу: | А вот так — компаратор, сравнивающий элементы по рейтингу: | ||
| - | <code> | + | <code javascript> |
| const compareByRating = (item1, item2) => { | const compareByRating = (item1, item2) => { | ||
| if (item1.rating < item2.rating) { | if (item1.rating < item2.rating) { | ||
| Строка 1245: | Строка 1321: | ||
| </code> | </code> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| def compare_by_rating(item1, item2): | def compare_by_rating(item1, item2): | ||
| if item1[rating] < item2[rating]: | if item1[rating] < item2[rating]: | ||
| Строка 1256: | Строка 1333: | ||
| return 1 | return 1 | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 1273: | Строка 1352: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| public static ToIntBiFunction<Map<String, Object>, Map<String, Object>> compareByRating = (item1, item2) -> { | public static ToIntBiFunction<Map<String, Object>, Map<String, Object>> compareByRating = (item1, item2) -> { | ||
| var rating1 = (double) item1.get("rating"); | var rating1 = (double) item1.get("rating"); | ||
| Строка 1290: | Строка 1371: | ||
| }; | }; | ||
| </code> | </code> | ||
| + | </details> | ||
| Универсальная функция сравнивает два элемента, но не использует операторы «больше» или «меньше». Вместо этого она вызывает компаратор и проверяет результат. Так выглядит универсальная пузырьковая сортировка: | Универсальная функция сравнивает два элемента, но не использует операторы «больше» или «меньше». Вместо этого она вызывает компаратор и проверяет результат. Так выглядит универсальная пузырьковая сортировка: | ||
| - | <code> | + | <code javascript> |
| const bubbleSort = (items, comparator) => { | const bubbleSort = (items, comparator) => { | ||
| for (let limit = items.length - 1; limit > 0; limit -= 1) { | for (let limit = items.length - 1; limit > 0; limit -= 1) { | ||
| Строка 1306: | Строка 1388: | ||
| }; | }; | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Python | + | <details> |
| + | <summary>Python</summary> | ||
| - | <code> | + | <code python> |
| def bubble_sort(items, comparator): | def bubble_sort(items, comparator): | ||
| for limit in range(len(items) - 1, 0, -1): | for limit in range(len(items) - 1, 0, -1): | ||
| Строка 1316: | Строка 1400: | ||
| items[i], items[i + 1] = items[i + 1], items[i] | items[i], items[i + 1] = items[i + 1], items[i] | ||
| </code> | </code> | ||
| + | </details> | ||
| - | PHP | + | <details> |
| + | <summary>PHP</summary> | ||
| - | <code> | + | <code php> |
| <?php | <?php | ||
| Строка 1335: | Строка 1421: | ||
| } | } | ||
| </code> | </code> | ||
| + | </details> | ||
| - | Java | + | <details> |
| + | <summary>Java</summary> | ||
| - | <code> | + | <code java> |
| class App { | class App { | ||
| public static void bubbleSort(Map[] items, ToIntBiFunction comparator) { | public static void bubbleSort(Map[] items, ToIntBiFunction comparator) { | ||