Почему python список показывает аномалии срезов? - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь рекурсивно разделить элемент списка (как в «разделяй и властвуй») и, следовательно, печатаю нарезанные элементы, но внезапно обнаруживает неожиданную ненормальность (в строке 6 и далее в Выходных данных).

def Mergesort(a, l, r):
    if(l<r):
      mid = (r+l+1) // 2
      print(a)
      Mergesort(a[l : mid], l, mid-1)
      Mergesort(a[mid : r+1], mid, r)

a = [8, 3, -2, 6, 7, 4, 1, 2, -1, 0, 9, 12, 11, 5] 
Mergesort(a, 0, len(a)-1)

Выход:

[8, 3, -2, 6, 7, 4, 1, 2, -1, 0, 9, 12, 11, 5]
[8, 3, -2, 6, 7, 4, 1]
[8, 3, -2]
[3, -2]
[6, 7, 4, 1]
[1]
[]
[2, -1, 0, 9, 12, 11, 5]
[]
[]
[]
[]
[]

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Я нашел решение. На самом деле, при передаче нарезанного списка в функцию, индекс начинается с нуля.

0 голосов
/ 18 марта 2020

Это потому, что ваш l, r в def Mergesort не точен. Когда вы объединяете ваш массив RHS a=[2, -1, 0, 9, 12, 11, 5], он фактически работает: Mergesort([2, -1, 0, 9, 12, 11, 5],7,10), но не Mergesort([2, -1, 0, 9, 12, 11, 5],0,3). Поскольку len (a) = 7, он вернет только пустой массив []. Я изменил коды:

def Mergesort(a, l, r):
    if(l<r):
        mid = (r+l+1) // 2
        print (a)
   #    
        Mergesort(a[l : mid], 0, len(a)-1)
        Mergesort(a[mid : r+1],0, len(a)-1)

a = [8, 3, -2, 6, 7, 4, 1, 2, -1, 0, 9, 12, 11, 5] 
Mergesort(a, 0, len(a)-1)

Теперь он может разбивать как правый, так и левый массивы. Вывод, если вы print (a) в предложении if:

[8, 3, -2, 6, 7, 4, 1, 2, -1, 0, 9, 12, 11, 5]
[8, 3, -2, 6, 7, 4, 1]
[8, 3, -2, 6, 7, 4, 1]
[8, 3, -2]
[8, 3, -2]
[8]
[3, -2]
[3]
[-2]
[]
[6, 7, 4, 1]
[6, 7, 4]
[6, 7]
[6]
[7]
[4]
[1]
[]
[2, -1, 0, 9, 12, 11, 5]
[2, -1, 0, 9, 12, 11, 5]
[2, -1, 0]
[2, -1, 0]
[2]
[-1, 0]
[-1]
[0]
[]
[9, 12, 11, 5]
[9, 12, 11]
[9, 12]
[9]
[12]
[11]
[5]
[]

Обратите внимание, что код все еще не совершенен и требует работы (но он решает проблему разделения, которую вы подняли), я бы предложил улучшения в

1) определение mid, чтобы правильно разделить массив четных чисел;

2) определение l и r, чтобы не разбивать одноэлементный массив.

...