@kolyazapoteev

Как правильно определить, какое число итераций необходимо?

Задача - написать функцию сортировки списка.
Текущее решение такое:
def sort(not_sorted_list: list) -> list:
	not_sorted_list = not_sorted_list[:]
	for _ in range(len(not_sorted_list)):
		for index, element in enumerate(not_sorted_list):
			try:
				next_element = not_sorted_list[index+1]
				currect_element = not_sorted_list[index]

				if next_element < currect_element:
					not_sorted_list[index] = next_element
					not_sorted_list[index+1] = currect_element
			except IndexError:
				break

	sorted_list = not_sorted_list[:]
	
	return sorted_list

data = [4, 354, 1, 4, 1, -10, 20]
sorted_list = sort(data)
print(data) # [4, 354, 1, 4, 1, -10, 20]
print(sorted_list) # [-10, 1, 1, 4, 4, 20, 354]

Проблема в следующем:
За один цикл:
for index, element in enumerate(not_sorted_list)
Полностью отсортировать список не выходит.
Для этого добавлен внешний цикл:
for _ in range(len(not_sorted_list)):
Но если брать именно длину списка, то цикл работает в холостую определенное количество циклов. В частности, даже при округленном длинна/1.5 сортировка завершается успешно.
Собственно вопрос в следующем - существует ли способ заранее понять, сколько итераций потребуется?
Если такого нет, что в принципе, ожидаемо, единственный вариант - сравнивать список "до" итерации и "после". Но в таком случае, не будет ли затраты на подобные сравнения "затратнее" холостых циклов?
  • Вопрос задан
  • 261 просмотр
Решения вопроса 3
@dmshar
А двавайте велосипед не выдумывать. Есть такой раздел вычислительной науки. "Теория алгоритмов" называется. Он-то как раз и занимается тем, что объясняет, как оценить вычислительную сложность алгоритмов, в том числе ОЦЕНИВАЕТ, сколько циклов, операций сравнения и пр. требуется для того или иного алгоритма.
Просто после вопроса " единственный вариант - сравнивать список "до" итерации и "после". Но в таком случае, не будет ли затраты на подобные сравнения "затратнее" холостых циклов?" становиться понятным, что тут не на конкретный вопрос отвечать надо, а с азов начинать. Ведь и то что это "единственный способ", и про то что сравнение можно сравнивать с холостым циклом - про все это говориться в Теории алгоритмов. Причем как правило - с самого начала.
Ответ написан
Комментировать
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Можно завести флаг "менялись ли элементы в цикле". Перед циклом его сбросить, при перестановке двух элементов - установить. А сам внешний цикл можно сделать while.

Заранее определить, сколько будет итераций - очень сложно.
Ответ написан
Комментировать
LivingDictionary
@LivingDictionary
Любознательный, но бессистемный.
я так понимаю дело не в сортировке, а в принципе? list.sort() не стоит предлагать?
я бы предложил использовать 2 списка, старый и новый.
количество итераций будет от "длинна списка" (если входной список будет строго возрастающим)до "длинна списка" в квадрате (если входной список будет строго убывающим).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы