Здравствуйте, system.console, Вы писали:
s> пробую тут заниматься с ребенком программизмом и неожиданно для себя обнаружил, что не помню как называется данный способ сортировки s>
s> for i in range(n):
s> for j in range(i + 1,n):
s> if a[i] > a[j]:
s> v = a[i]
s> a[i] = a[j]
s> a[j] = v
s>
Здравствуйте, system.console, Вы писали:
SC>пробую тут заниматься с ребенком программизмом и неожиданно для себя обнаружил, что не помню как называется данный способ сортировки
Похоже на неоптимизированную сортировку выбором, если ориентироваться на диапазоны сравнения и сравниваемые элементы.
Здравствуйте, system.console, Вы писали:
SC>пробую тут заниматься с ребенком программизмом и неожиданно для себя обнаружил, что не помню как называется данный способ сортировки SC>
SC>for i in range(n):
SC> for j in range(i + 1,n):
SC> if a[i] > a[j]:
SC> v = a[i]
SC> a[i] = a[j]
SC> a[j] = v
SC>
SC>?
Это алгоритм сортировки выбором (Selection Sort).
Давайте разберем, почему:
Принцип работы:
Внешний цикл (i) проходит по элементам массива
Внутренний цикл (j) ищет минимальный элемент в неотсортированной части
Если находит элемент меньше текущего (a[i]), происходит обмен
Особенности алгоритма:
На каждом шаге выбирается минимальный элемент из неотсортированной части
Он меняется местами с первым элементом этой части
Процесс повторяется для оставшейся части массива
Характеристики:
Временная сложность: O(n²) в худшем, среднем и лучшем случаях
Пространственная сложность: O(1)
Этот алгоритм является одним из простейших алгоритмов сортировки, но не самым эффективным из-за квадратичной сложности. Однако его преимущество в том, что он делает минимальное количество обменов (ровно n обменов для массива из n элементов).
Здравствуйте, system.console, Вы писали:
SC>пробую тут заниматься с ребенком программизмом и неожиданно для себя обнаружил, что не помню как называется данный способ сортировки SC>
SC>for i in range(n):
SC> for j in range(i + 1,n):
SC> if a[i] > a[j]:
SC> v = a[i]
SC> a[i] = a[j]
SC> a[j] = v
SC>
SC>?
У нас называли "сортировка обменами", насколько я помню.
SC>>пробую тут заниматься с ребенком программизмом и неожиданно для себя обнаружил, что не помню как называется данный способ сортировки SC>>
SC>>for i in range(n):
SC>> for j in range(i + 1,n):
SC>> if a[i] > a[j]:
SC>> v = a[i]
SC>> a[i] = a[j]
SC>> a[j] = v
SC>>
SC>>?
CF>У нас называли "сортировка обменами", насколько я помню.
у нас тоже, но произведя беглый поиск в интернетах, составил себе мнение, что сортировка обменами есть более общее название.
В частности пузырьковая сортировка тоже к ним относится.
Не ?
Здравствуйте, system.console, Вы писали:
CF>>У нас называли "сортировка обменами", насколько я помню. SC>у нас тоже, но произведя беглый поиск в интернетах, составил себе мнение, что сортировка обменами есть более общее название. SC>В частности пузырьковая сортировка тоже к ним относится. SC>Не ?
Ну, если совсем придираться, то любая сортировка — это перестановка элементов, смена позиций существующих элементов, и при желании её всегда можно будет натянуть под "обмены".
Тут всё-таки суть процедуры в том, что нашли два целевых элемента и непосредственно поменяли их местами друг с другом. А в пузырьке обмены — это лишь мелкие промежуточные шаги, сугубо техническая операция. Находящаяся на том же уровне значимости, что и сравнения; но никто же не выделяет пузырёк в класс "сортировок сравнением".
Акелла (то есть нейросеть) тут явно промахнулся. selection sort описан правильно, но приведенный тредстартером код — не selection sort. Как нетрудно заметить, количество обменов там O(N^2).
А значит, это один из вариантов алгоритмов обмена, обычно называемых "пузырьковой сортировкой", т.к. мЕньшие значения путем постоянных обменов "всплывают" к началу массива.
PS: одного лишь предисловия "попробовал позаниматься" хватает для догадки "пузырек". Это самый простой вариант, который легко может придумать кто угодно. Над всеми остальными сортировками придется думать, и объяснять на основе предыдущих алгоритмов (типа "поиск индекса минимального значения").
SD>Акелла (то есть нейросеть) тут явно промахнулся. selection sort описан правильно, но приведенный тредстартером код — не selection sort. Как нетрудно заметить, количество обменов там O(N^2).
Однако выглядит оно именно как модифицированный вариант selection sort, где при селекции мин. элемента вместо временной переменной происходит swap для каждого кандидата на минимум.
SD>А значит, это один из вариантов алгоритмов обмена, обычно называемых "пузырьковой сортировкой", т.к. мЕньшие значения путем постоянных обменов "всплывают" к началу массива.
В insertion sort тоже обмены, и их число O(N^2) как и в bubble sort.
SD>PS: одного лишь предисловия "попробовал позаниматься" хватает для догадки "пузырек". Это самый простой вариант, который легко может придумать кто угодно. Над всеми остальными сортировками придется думать, и объяснять на основе предыдущих алгоритмов (типа "поиск индекса минимального значения").
вот пузырек
for i in range(n - 1):
m = 0
for j in range(n - 1 - i):
if b[j] > b[j + 1]:
m += 1
x = b[j]
b[j] = b[j + 1]
b[j + 1] = x
if m == 0:
break
а вот то, про что я спрашивал
for i in range(n):
for j in range(i + 1,n):
if a[i] > a[j]:
v = a[i]
a[i] = a[j]
a[j] = v
по-твоему это одно и то же, даже если из пузырька выкинуть преждевременный выход из внешнего цикла при отсутствии обменов в теле внутреннего ?
Здравствуйте, system.console, Вы писали:
SC>пробую тут заниматься с ребенком программизмом и неожиданно для себя обнаружил, что не помню как называется данный способ сортировки SC>
SC>for i in range(n):
SC> for j in range(i + 1,n):
SC> if a[i] > a[j]:
SC> v = a[i]
SC> a[i] = a[j]
SC> a[j] = v
SC>
Здравствуйте, netch80, Вы писали:
N>Selection sort — это когда (выберем направление) сначала во всех позициях 1..N ищется минимум, переставляется с 1-м, если он был не в позиции 1.
Да, и код ТС именно это и делает
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
N>>Selection sort — это когда (выберем направление) сначала во всех позициях 1..N ищется минимум, переставляется с 1-м, если он был не в позиции 1.
TB>Да, и код ТС именно это и делает
Ты прав, что это не пузырёк. Я что-то не проснулся разбирая это...
Но у него грубоватый метод. Классическая сортировка выбором — это когда такое делается за один обмен на каждую установку элемента, то есть так:
for (i = 1; i <= N; ++i) {
int idx_min = i;
// Сначала найти один минимальный
for (j = i + 1; j <= N; ++j) {
if (a[j] < a[idx_min]) { idx_min = j; }
}
// и только его переместить
if (idx_min != i) {
swap(&a[i], &a[idx_min]); // облом расписывать промежуточную переменную
}
}
(ну или наоборот, если начинаем искать максимальные)
А то, что видим у ТС — какой-то совсем кривой вариант с кучей бессмысленных обменов, я тоже не знаю, как его назвать...
Здравствуйте, system.console, Вы писали:
SC>по-твоему это одно и то же, даже если из пузырька выкинуть преждевременный выход из внешнего цикла при отсутствии обменов в теле внутреннего ?
да одно и тоже это. Второй вариант — кошерный неоптимизированный пузырёк. Нахрен ребёнку забивать мозги разными способами сортировки? Показали один, показали на примере первого прохода, что элементы "всплывают" — всё, назвали пузырьком и угомонились. А если интерес проснётся независимо от родителей, то даёшь Кнута для самостоятельного полоскания мозгов.
SP>да одно и тоже это. Второй вариант — кошерный неоптимизированный пузырёк.
Если присмотреться внимательно, во "втором варианте" сравнивается не a(j) с a(j+1), а a(i). То есть это как бы заготовка selection sort, на что, видимо, и купилась нейросеть. Заготовка могла бы быть чуть эффективнее "пузырька" по количеству обменов (O(N)), но из-за кривости реализации получился опять O(N^2). То есть по всем факторам как пузырек. Пошаговый проход будет показывать слегка иную картину. Элемент не "всплывает" из конца массива к началу, но при каждом проходе постоянно заменяет собой a(i).
В общем, я бы это все равно отнес к "пузырьковым" методам чисто из-за асимптотики. Если заменить обмен на запоминание индекса, и обмен производить во внешнем цикле, вот тогда это будет сортировка выбором.