Перейти к основному содержанию
CalcMax

Калькулятор сортировки чисел

Результат

-10, -3, 0, 4, 7, 12.5

По возрастанию

Минимум
-10
Максимум
12.5

Разложить набор чисел от меньшего к большему — значит расставить их в том порядке, в каком они стоят на числовой прямой, читая слева направо. Список 7; −3; 12,5; 0; −10; 4 превращается в −10, −3, 0, 4, 7, 12,5, и два конца этой линии — наименьшее значение и наибольшее. Эта страница делает то же самое с любым списком, до двухсот чисел, и печатает отсортированный список вместе с минимумом и максимумом. Работа небольшая, и осторожность здесь уместна: очевидный способ ошибается в двух местах. Первое — числа нужно сравнивать как числа, а не как текст. Сортировка тех же значений как строк даёт −10, −3, 0, 12.5, 4, 7 — она ставит 12.5 перед 4, потому что символ 1 идёт раньше символа 4, и сравнение не доходит до цифры после точки. На списке однозначных положительных чисел эта ошибка не проявляется никогда, и именно поэтому она опасна: она переживает любую проверку, в которую случайно не попало многозначное или отрицательное число, а потом всплывает на списке, где такое число есть. Второе — отрицательные числа, где та же ловушка разворачивается зеркально: как строки, −10 идёт раньше −2, и это выглядит правильно, тогда как −2 идёт раньше −10, а это уже неверно. Правильный порядок ставит −20 перед −10 перед −3, потому что левее на прямой значит меньше, а не длиннее. Две вещи, которые страница делает и которые легко не заметить. Она сохраняет повторы, поэтому 5, 5, 3 выходит как 3, 5, 5: удаление повторов — другая операция, и здесь она означала бы, что в ответе больше нет ровно тех чисел, которые вы дали. И она печатает каждое значение в канонической записи, поэтому 12,50 становится 12,5, а +7 становится 7: конечные нули и ведущий плюс не являются частью значения. Если вы написали их так намеренно, вывод этого не сохранит. Сортировка списка — первый шаг почти для всего, что люди хотят узнать о наборе чисел: медиана — это середина отсортированного списка, размах — его два конца, а квартили отсчитываются по нему в фиксированных позициях.

Формула

7; −3; 12,5; 0; −10; 4 ⇒ −10, −3, 0, 4, 7, 12,5; минимум = −10, максимум = 12,5

n
Сколько чисел в списке — от 1 до 200. Одно число допускается и даёт список из одного элемента, и это не вырожденный случай, а честный ответ: единственное число уже стоит по возрастанию, и оно же является и наименьшим, и наибольшим в наборе
a ≤ b
Сравнение, на котором держится сортировка, и в нём же вся её правильность. Сравнение числовое, поэтому −10 ≤ −3 и 9 ≤ 10 выполняются. Сравнение как текста вместо этого случайно поставило бы −10 перед −3, а 10 перед 9 — по той же причине: оно идёт по символам слева направо, а не по величине. Числовая прямая и есть картинка, на которой видно, чем одно отличается от другого: меньше значит левее, и ничего больше
−10, −3, 0, 4, 7, 12,5
Отсортированный вывод и перестановка ввода: шесть значений вошло, шесть вышло, те же самые. Это и есть инвариант, по которому стоит проверять результат, если он вызывает сомнение: количество обязано совпасть, и каждое введённое значение должно встретиться ровно столько раз, сколько вы его ввели. Ничего на этой странице не прибавляет, не убирает и не объединяет числа
минимум = −10
Первый элемент отсортированного списка, взятый из него самого, а не найденный отдельным проходом. На числовой прямой это самая левая точка. Это не то же самое, что самая «короткая» запись во вводе: −10 выглядит короче, чем −3, а число это меньшее
максимум = 12,5
Последний элемент отсортированного списка, тоже прочитанный, а не найденный поиском. Промежуток между ним и минимумом — это размах, и он единственная статистика, которой кроме этих двух значений ничего не нужно: страница размаха считает ровно его из той же пары
3, 5, 5
Что происходит с повторами. Ввод 5, 5, 3 сортируется в 3, 5, 5, то есть повтор выживает. Убрать его было бы опрятнее на вид и сломало бы инвариант выше, а заодно молча изменило бы ответ на любой вопрос о том, сколько значений в списке, включая медиану

Прочитать медиану — самая частая причина отсортировать список: медиана это средний элемент списка по возрастанию или полусумма двух средних при чётном количестве, и ни то, ни другое нельзя прочитать в неотсортированном списке вообще. То же верно для квартилей и процентилей: они определяются позицией в отсортированном порядке. Второе применение — размах, то есть наибольшее значение минус наименьшее, и эта страница печатает оба этих числа прямо, а вычитание делает страница размаха, если нужен только он. Третье — обычное человеческое: столбец измерений, цен, возрастов или оценок, вставленный из таблицы, читается намного легче, когда он упорядочен, потому что крайние значения сразу бросаются в глаза, а сгустки становятся видны. По той же причине отсортированный список первым делом и рисуют: подсчёт частот и гистограмма оба начинаются с него. Четвёртое применение — проверка чужой сортировки. Сортировка как текста, а не как чисел — распространённая ошибка в табличных редакторах, когда столбец отформатирован необычно, и симптом у неё ровно тот, что описан выше: 10 перед 9 или 12,5 перед 4. Если отсортированный столбец кажется вам неправильным, прогоните те же значения через эту страницу — она скажет, кто из двоих неверно читает ввод. Для порядка по убыванию отдельной кнопки нет: это тот же вывод, прочитанный справа налево. Когда список упорядочен, в дело вступают соседние описательные страницы: медиана читает середину, размах — два конца, квартили — позиции четвертей, а среднее — то из них, которому порядок безразличен.

Разобранные примеры

  1. Смешанные знаки и десятичная дробь: 7; −3; 12,5; 0; −10; 4

    1. Сначала наименьшее значение: −10 стоит левее всех остальных чисел списка
    2. Затем следующее по величине, −3, потом 0, потом 4, потом 7
    3. 12,5 — наибольшее, поэтому оно идёт последним
    4. Отсортированный список — −10, −3, 0, 4, 7, 12,5, а его два конца дают минимум и максимум

    Ввод по умолчанию, и намеренно неудобный: в нём два отрицательных числа, положительная десятичная дробь и ноль, то есть обе ловушки сразу. Заметьте, что −10 идёт первым, хотя −3 из этих двух выглядит более длинным числом, и что 12,5 стоит после 7, хотя начинается с той же цифры, что и единица. Сортировка этих же значений как текста дала бы −10, −3, 0, 12.5, 4, 7: отрицательный конец случайно оказался бы правильным, а десятичная дробь встала бы не на своё место.

  2. Ловушка, которую прячут однозначные числа: 9; 10; 100; 2

    1. Сравниваем по величине, а не по первой цифре: 2 меньше 9
    2. 10 больше 9, но меньше 100
    3. Порядок — 2, 9, 10, 100
    4. Наименьшее здесь 2, а наибольшее 100

    Четыре коротких положительных числа — и список, на котором ловится текстовая сортировка. Сравнение как строк ставит 10 первым, а 2 последним, потому что оно останавливается на первом символе: 1 идёт раньше 2, а 2 раньше 9. Правильный порядок получается из сравнения величин, а признак того, что что-то пошло не так, — результат не похож на числовую прямую: нет такого расположения цифр, в котором 10 стояло бы перед 2. Это тот случай, которым стоит проверять любой код сортировки, потому что список однозначных чисел сортируется правильно в обоих вариантах.

  3. Отрицательные в другом порядке: −5; −20; −3

    1. На числовой прямой −20 стоит левее всех трёх
    2. −5 правее него, а −3 — самое правое из трёх
    3. Значит порядок по возрастанию — −20, −5, −3
    4. Минимум равен −20, то есть числу с самыми большими цифрами в этом списке

    Зеркало предыдущего примера, и он ловит уже не код, а читателя. −20 — наименьшее из трёх, хотя цифры у него самые большие, потому что левее на прямой значит меньше. Текстовая сортировка здесь случайно даёт правильный ответ: строка −20 действительно идёт раньше −5, — поэтому на отрицательных числах текстовая сортировка выглядит верной, а терпит неудачу на положительных многозначных. Вдвоём эти примеры закрывают оба направления, ради чего оба здесь и стоят.

Ограничения

Список принимает от 1 до 200 чисел, разделённых запятыми, точками с запятой или пробелами, и все три разделителя можно смешивать в одном списке. Двести — это ограничение на длину списка, а не забота о скорости: более длинные списки не считаются медленно, они отклоняются, потому что такое поле перестаёт быть редактируемым, а ответ — читаемым. Числа могут быть отрицательными, могут иметь десятичную часть и могут быть нулём, а повторы сохраняются, а не удаляются. Разделители разрядов не понимаются. Запятая, после которой стоит пробел, разделяет записи, а запятая между двумя цифрами без пробела читается как десятичный разделитель, поэтому 1,5 — это одна целая пять десятых. Запись 1,500 не является ни тем, ни другим: её одинаково можно прочитать и как 1,5, и как тысячу пятьсот, и поле отказывается угадывать — пишите 1500, а не 1,500. В русском к этому добавляется ещё одна ловушка, которой нет в английском: пробел тоже разделитель, поэтому 1 500 будет прочитано как два числа, 1 и 500, и получится список из двух элементов вместо одного. Разделители разрядов в этом поле не пишутся вообще: ни пробелом, ни запятой. Столбец, вставленный из таблицы, где большие числа сгруппированы, отклоняется, а не читается наугад; перед вставкой разделители нужно убрать. Экспоненциальная запись тоже не понимается: 1e5 отклоняется, а не читается как 100000. Вывод — это каноническая запись каждого значения, а не копия того, что вы набрали: 12,50 печатается как 12,5, +7 печатается как 7, а −0 печатается как 0. И замечание о чтении: значения в выводе печатает сама программа машинным форматом — с точкой в десятичной части, с знаком минус из дефиса, без разделения разрядов и с переходом на экспоненциальную запись начиная с 10²¹, где преобразование числа в текст само меняет форму, — тогда как текст этой страницы записан по русским правилам: с запятой в десятичной части, со знаком минус и с неразрывными пробелами между разрядами. Это одни и те же числа, записанные двумя способами, а не два разных набора. Справочной таблицы на этой странице нет: таблица нужна, чтобы показать, в какую полосу попадает результат, а у сортировки полос нет. Порядок предлагается только по возрастанию — для порядка по убыванию прочитайте вывод справа налево.

Частые вопросы

Как отсортировать список, в котором есть и отрицательные числа, и десятичные дроби?
Вставьте его, и страница сделает всё сама: разделителем может быть запятая, точка с запятой или пробел, и все три можно смешивать. Отрицательные числа и десятичные дроби на правило не влияют — меньшее число просто идёт левее. Следить нужно за двумя вещами: −20 меньше, чем −3, несмотря на большее число цифр, а 12,5 больше, чем 4, несмотря на первую цифру 1. Сравнение величин, а не текста чисел, и есть здесь вся правильность.
Имеет ли значение, в каком порядке я ввожу числа?
Никакого. Страница сортирует то, что ей дали, и один и тот же набор значений всегда даёт один и тот же вывод, в каком бы порядке они ни пришли. Именно это и делает результат проверяемым: отсортируйте список, потом отсортируйте его снова — вывод совпадёт, потому что порядок по возрастанию для данного набора значений только один. Единственное, в чём сохраняется форма ввода, — это повторы: 5, 5, 3 и 3, 5, 5 дают одно и то же 3, 5, 5.
Повторяющиеся значения удаляются?
Нет, и это сделано намеренно. Вывод — это переставленный ввод, поэтому в нём должны быть ровно те числа, которые вы дали, каждое столько раз, сколько вы его дали. Удаление повторов было бы другой операцией — она называется удалением дубликатов и меняет ответ на любой вопрос о списке, включая то, сколько в нём значений и чему равна медиана. Если нужен список различных значений, это отдельный шаг, и он должен быть заметным.
Почему 12,50 вернулось как 12,5?
Потому что конечные нули не являются частью значения, а страница печатает каноническую запись каждого числа, а не копию того, что вы набрали. Та же нормализация превращает +7 в 7, а −0 в 0. Это единственное место, где вывод не вполне копия ввода, и о нём стоит знать, если формат записи для вас что-то значит, — например, в ценах, где 12,50 и 12,5 читаются человеком по-разному, хотя число это одно и то же.
Можно ли отсортировать не по возрастанию, а по убыванию?
Страница даёт порядок по возрастанию, а порядок по убыванию — это тот же вывод, прочитанный справа налево: вычислять тут нечего, потому что перевёрнутый отсортированный список сразу даёт обратный порядок. Предлагается только одно направление потому, что именно его требуют все последующие статистики: медиана, квартили и размах определяются по списку по возрастанию, и список по убыванию пришлось бы перед чтением любого из них переворачивать обратно.
Почему мой столбец из таблицы отклонён?
Почти наверняка из-за разделителей разрядов. На этой странице запятая, после которой стоит пробел, разделяет записи, а запятая между двумя цифрами без пробела читается как десятичный разделитель; запись 1,500 не является ни тем, ни другим, поэтому 1500 и 1,5 нельзя различить, и весь список отклоняется, а не читается наугад. Пробел в роли разделителя разрядов здесь тоже не работает: 1 500 будет прочитано как два числа, 1 и 500. Экспоненциальная запись отклоняется так же: 1e5, а не 100000. Уберите разделители перед вставкой.

Источники

Похожие калькуляторы