Как выполнить сортировку вставки Python только в определенном диапазоне списка?

#python #insertion-sort

#python #вставка-сортировка

Вопрос:

Итак, я попытался и получил [1, 2, 3, 5, -4] но я хочу получить [3, 1, 2, 5, -4] вместо этого в качестве результата; потому что я хочу сортировать только от индекса 1 до индекса 4 (включая начало, исключая конец; что означает только сортировкуот индекса 1 до индекса 3, оставляя индексы 0 и 4 как есть) списка

 def insertionSort(the_list, start, end):
    for mark in range(start, end):
        temp = the_list[mark]
        i = mark-1
        while i >= 0 and the_list[i] > temp:
            the_list[i 1] = the_list[i]
            i -= 1
        the_list[i 1] = temp

    return the_list

print(insertionSort([3, 2, 5, 1, -4], 1, 4))
 

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

Ответ №1:

Вам нужно нарезать раздел, который вы хотите отсортировать. Вот как я бы реализовал.

 def insertionSort(alist,s, e):

    #check if s or e is greater than the length of the list
    if s >= len(alist) or e >= len(alist):
        #if True, then request is invalid
        return ('invalid request')

    #sort the list for the slice of data
    alist[s:e] = sorted(alist[s:e])

    # now return the full list 
    # The above code ensures you are not touching values before and after
    return alist

print (insertionSort([3, 2, 5, 1, -4], 1, 4))
 

Результатом этого будет:

 [3, 1, 2, 5, -4]
 

Объяснение проблем в вашем коде:

Ваш цикл for начинается от начала до конца. Однако вы проверяете значения из start — 1 (код i = mark — 1). Когда отметка равна 1 (начало), вы устанавливаете значение i равным 0 (отметка — 1, т.Е. 1 — 1 = 0). Это заставляет ваш код учитывать 0-ю позицию. Вот почему вы получаете 1, 2, 3, 5, -4 результат.

Кроме того, если вы зададите значение, превышающее количество элементов в списке, ваш код выйдет из строя. Вы также должны позаботиться об этом условии. Например, если вы дадите print (insertionSort([3, 2, 5, 1, -4], 1, 7)) , код завершится сбоем.