2016-05-04 3 views
1

Я работал через проблему, чтобы отсортировать элементы в порядке убывания через рекурсивный подход, код выглядит следующим образом ..Рекурсивные сортировки Выбора возвращают список нисходящего в питоне

import operator 

def do_stuff(elem_list): 

    if not elem_list: 
     return None 

    max_index , max_element = max(enumerate(elem_list) , key = operator.itemgetter(1)) 
    elem_list[max_index],elem_list[0] = elem_list[0],elem_list[max_index] 

    return do_stuff(elem_list[1:]) 

p_list = [4,2,3,5,1] 
do_stuff(p_list) 
print(p_list) 

Выход -

[5, 2, 3, 4, 1] 

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

+0

'elem_list [1:]' является полностью отдельный список из 'elem_list'. – user2357112

+0

Это всего лишь фрагмент elem_list. После этой функции, после распечатки списка, если она не даст мне правильный материал? – Steve

+0

Попробуйте fiddling с 'l1 = [1, 2, 3]; l2 = l1 [1:] 'в интерактивном режиме и посмотреть, с каким эффектом меняется один список с другой. – user2357112

ответ

1

Я смог исправить вашу проблему, добавив дополнительный параметр, так как вы, похоже, используете рекурсивную реализацию insertion sort, вам нужно каким-то образом отслеживать следующее открытое место для обмена значениями в списке.

import operator 
def sortl(l, last): 
    # base case 
    if last + 1 >= len(l): 
     return l 
    # find the max index (mi) and max value in the list 
    mi, _ = max(enumerate(l[last:]), key = operator.itemgetter(1)) 
    mi += last # caculate the offset in the sublist 
    l[mi], l[last] = l[last], l[mi] # swap the values 

    # recursive call 
    return sortl(l, last + 1) 

С помощью "последний + 1" каждый раз, вы можете моделировать, используя базовую подсписок так вызова do_stuff ([some_list [1:]) не будет работать

+0

Большое спасибо. Это прекрасно! – Steve

+0

Вы можете дать 'last' значение по умолчанию' 0', так что вы можете вызвать 'sortl' только с одним списком, и он все равно будет работать так, как ожидалось. – Blckknght

Смежные вопросы