Как исправить этот выбор сортировки логической ошибки? - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь реализовать сортировку выбора, но она не работает так же, как в алгоритме, я что-то не так сделал с операторами присваивания?

def selection_sort(list_1):
    for i in range(len(list_1)):
        val = min(list_1[i:])
        list_1[i],list_1[list_1.index(val)] =list_1[list_1.index(val)], list_1[i]
    print (list_1)

print(selection_sort([3,3,4,3,465,45,346,5,456,545,345345,345]))`

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

Проблема заключается в том, что при вызове функции index в массиве есть несколько чисел с одинаковым значением.Таким образом, он выбирает первое совпадающее число, которое видит во всем массиве, которое может быть уже отсортированным значением (до текущего i).

Это лучший способ сделать это:

def selection_sort(list_1):
    for i in range(len(list_1)):
        min_val = list_1[i]
        min_i = i
        for j in range(i + 1, len(list_1)):
            if list_1[j] < min_val:
                min_val = list_1[j]
                min_i = j

        list_1[i], list_1[min_i] = list_1[min_i], list_1[i]
    print (list_1)

selection_sort([3,3,4,3,465,45,346,5,456,545,345345,345])

Новый фрагмент кода находит индекс наименьшего значения за i, который хранится в min_i.

0 голосов
/ 20 апреля 2019

Я выяснил, что проблема вызвана list_1.index (val), потому что каждый раз, когда он будет искать val в начале списка, для решения этой проблемы достаточно использовать второй параметр, такой как list_1.index (val , начало)

def selection_sort(list_1):
    for i in range(len(list_1)):
        val = min(list_1[i:])
        temp = list_1[i]
        list_1[list_1.index(val, i)], list_1[i] = temp, val
    print (list_1)

selection_sort([3,3,4,3,465,45,346,5,456,346,456,545,345345,345])

результат равен [3, 3, 3, 4, 5, 45, 345, 346, 346, 456, 456, 465, 545, 345345]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...