@mestniy_tatarin

Проблемой с программой сортировки случайных списков. Поможете?

Здравствуйте. У меня проблема в написании программы по вычислению среднего значения времени, затраченного на сортировку списка. Условия задачи:
Для каждого алгоритма сортировки подсчитать среднее (необходимо измерить 10 раз) время выполнения сортировки для 10,100,1000,10000,100000 элементов. Список элементов выбираются рандомно. Алгоритмы:

1)пузырьковая сортировка

Для подсчета времени использовать time.perf_counter() - возвращает время с максимальной точностью. В подсчет времени НЕ нужно включать время создания случайного массива.
Сама проблема состоит в том, что программа слишком долго сортирует. Да, это Bubble sort однако преподаватель говорит что она должна работать не более 40 минут. По моим подсчётам моя программа выдаст результат только по истечению 5-6 часов. Помогите выявить проблемы и нати их решение, пожалуйста.
import time
import random

st4rt_time = time.time()

def bubble_sort(list):
    swapped = True
    while swapped:
        swapped = False
        for i in range(len(list) - 1):
            if list[i] > list[i + 1]:
                list[i], list [i + 1] = list [i + 1], list[i]
                swapped = True

m = [10, 100, 1000, 10000, 100000]
for e in m:
    for i in range(10):
        spisok = [random.randint(0, e) for x in range(0, e)]
        time_start = time.perf_counter()
        bubble_sort(spisok)
        time_start += time.perf_counter() // 10
        end = time.perf_counter()
        spisok = []
    print(f'Время выполнения алгоритма списка с {e} элементами: {time.perf_counter() - time_start}, среднее значение времени: {time_start}')
print("------------------------------------------------Время выполнения программы: %s seconds------------------------------------------------" % round(time.time() - st4rt_time))


Спасибо за поправку в комментариях, теперь прога выглядит так:
import time
import random

st4rt_time = time.time()

def bubble_sort(array):
    length = len(array)
    for i in range(length):
        for j in range(0, length - i - 1):
            if array[j] > array[j + 1]:
                temp = array[j]
                array[j] = array[j + 1]
                array[j + 1] = temp


mean_time = 0
m = [10, 100, 1000, 10000, 100000]
for e in m:
    for i in range(10):
        spisok = [random.randint(0, e) for x in range(0, e)]
        start_time = time.perf_counter()
        bubble_sort(spisok)
        end_time = time.perf_counter()
        elapsed_time = end_time - start_time
        mean_time += elapsed_time
        mean_time /= 10
    print(f"Время работы списка из {e} элементов:{elapsed_time}. Среднее время работы: {mean_time}")
print("------------------------------------------------Время выполнения программы: %s seconds------------------------------------------------" % round(time.time() - st4rt_time))


Однако, остается проблема. Список из 100к элементов всё равно долго рассчитывается. Есть вариант просто умножить значение времени для списка 10к элементов на сто и получится приблизительное время сортировки списка 100к элементов. Остается два вопроса: 1) Как это реализовать чтобы программа сама умножала значение времени 10к списка на 100, а после высчитывала среднее время дял списка 100к?
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
У вас неэффективно написана сортировка.
При правильной сортировке пузырьком в худшем случае будет (N2-N)/2 итераций, у вас - N2.
Ответ написан
Ваш ответ на вопрос

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

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