2016-07-14 2 views
1

Я новичок в Python и пытаюсь реализовать сортировку вставки на языке. Однако, когда я пытаюсь выполнить мой код в списке, я получаю тот же список назад. Я понял, что код даже не подходит ко второму циклу. Я использую Python 3. Что не так с итерацией назад таким образом?Python3 вставка сортировка итерации назад не работает

def ins_sort(us_in): 
    tmp = None 
    for key in range(1, len(us_in)-1): 
    for i in range(key, 0, -1): 
     if us_in[key] < us_in[i] and key != 0: 
     tmp = us_in[key] 
     us_in[key] = us_in[i] 
     us_in[i] = tmp 
    return us_in 

print(ins_sort([5,2,4,6,1,3])) 

Результат:

[5,2,4,1,6,3] 
+0

После исправления отступов я поставил оператор печати во втором цикле и выполнил его как ожидалось (я обновил ваш вопрос с фиксированным отступом). С вашим итератором нет проблемы. –

ответ

1

У вас есть 2 проблемы в вашем коде прямо сейчас. Наведите курсор мыши на желтый, если вы не можете понять это;)

Один в этом фрагменте кода:

for key in range(1, len(us_in)-1): 

Вы хотите сделать for key in range(1, len(us_in)): так вы достигнете каждый элемент списка

И другой в этом блоке:

if us_in[key] < us_in[i] and key != 0: 
    tmp = us_in[key] 
    us_in[key] = us_in[i] 
    us_in[i] = tmp 

Когда вы итерации, key остается таким же, как и вы. Вы хотите, чтобы он двигался с i, а не оставался неподвижным. Вы можете заменить каждое событие i на i-1 и заменить каждый key на i, чтобы исправить это.

0

Совет: поместите «отпечатки» всюду, они помогут вам следить за состоянием ваших переменных.

При этом попробуйте поместить переменную tmp вне инструкции «if». И для работы в обратном направлении, попробуйте следующее:

for i in range(end): 
     backwards = end - i 
    #do something using "backwards" instead of "i" 

Похоже, вы получили ответ на свой вопрос, во всяком случае я не буду удалять это так, вы можете держать кончик, так как вы новичок, печать будет ваш лучшим друг , Доверьтесь мне.

+0

Его метод бега назад отлично работает. Я понял, что случилось. См. Мой ответ, если вам интересно :) – Brian

+0

Вы правы, попробовали свой ответ, и он работал отлично, но я все время боюсь, почему его код не работает с постоянной «ключевой» переменной. –

+0

Если вы думаете об этом, если 'key' останется прежним, он будет продолжать заменять' i' на 'key', поскольку' i' уменьшается, что не является тем, что вы хотите для сортировки вставки. При вставке сортировки вы можете сделать одну из двух вещей. a) Переведите элемент вниз по списку, пока не дойдете до конца, или b) замените элемент на самое раннее место, где он подходит. OP выглядел так, как будто он делает a), но у него было немного проблемы – Brian

0

В основном есть две строки, которые необходимо отредактировать. третья линия должна быть LEN (us_in) не LEN (us_in) -1 И в заявлении, если оно должно быть я> = 0 Вместо Key = 0 Также второй цикл должен начать назад от ключа! - 1 {one less iteration}

+0

Это не работает, попробуйте запустить его.См. Мое решение, если вы смущены тем, почему код OP не работает :) – Brian

+0

да, я согласен, что это не работает. ваше решение правильно. – badiya

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