Индекс вне диапазона в Python для слияния - PullRequest
1 голос
/ 04 апреля 2019

Я работаю над проектом и пытался внедрить сортировку слиянием в python, но я получаю индекс вне диапазона Ошибка, так как я новый python sp, не очень разбирающийся в синтаксисе python и встроенных функциях

     def merge1(a,l,h):
        if l<h:
            mid=int((l+h)/2)
            left=a[:mid]
            right=a[mid:]
            merge1(left,l,mid)
            merge1(right,mid+1,h)
            mergesort(a,l,mid,h)
     def mergesort(a,l,mid,h):    
        i=l
        j=mid+1
        k=l
        b=[]
        while i<=mid and j<=h:
            if a[i]<=a[j]:
                b[k]=a[i]
                i+=1
            else:
                b[k]=a[j]
                j+=1
            k+=1    
        if i>mid:
            for x in mid(j,h):
                b[k]=a[x]
                k=k+1
        else:
            for x in range(i,mid):
                b[k]=a[x]
                i=i+1
        for i in range(0,k):
            a[k]=b[k]
      a=[9,1,45,99,98,56]
      merge1(a,0,len(a)-1)
      print(a)

    <ipython-input-71-e2786b6fbe02> in mergesort(a, l, mid, h)
     15     b=[]
     16     while i<=mid and j<=h:
---> 17         if a[i]<=a[j]:
     18             b[k]=a[i]
     19             i+=1

    IndexError: list index out of range

1 Ответ

2 голосов
/ 05 апреля 2019

Синтаксис Python для подмассива - это массив [начало, конец], где диапазон индекса находится в диапазоне от начала до конца-1 включительно (он не включает конец). Условия завершения для индексов должны быть <не <=, например i <mid, вместо i <= mid. </p>

Имена merge1 и mergesort меняются местами. mergesort () на самом деле является функцией слияния, а merge1 на самом деле является рекурсивной функцией слияния сверху вниз. Имена должны поменяться местами.

Функция сортировки слиянием должна создавать только стек вызовов, включающий массив и диапазон индекса. left и right должны быть созданы из массива «a» в функции слияния, а затем объединены обратно в «a» во время процесса слияния.

Первоначальный вызов функции сортировки слиянием должен иметь параметры (a, 0, len (a))


Пример кода

def mergesort(a,beg,end):
    if (end-beg) > 1:
        mid=(beg+end)//2
        mergesort(a,beg,mid)
        mergesort(a,mid,end)
        merge(a,beg,mid,end)
def merge(a,beg,mid,end):
    left = a[beg:mid]
    right = a[mid:end]
    i = 0
    j = 0
    k = beg   
    while True:
        if left[i] <= right[j]:
            a[k] = left[i]
            i += 1
            k += 1
            if(i < len(left)):
                continue
            a[k:end] = right[j:len(right)]
            break
        else:
            a[k] = right[j]
            j += 1
            k += 1
            if(j < len(right)):
                continue
            a[k:end] = left[i:len(left)]
            break

a=[9,1,45,99,98,56]
mergesort(a,0,len(a))
print(a)
...