
Juan Cruz Stakys
Pregunta¿Por qué el algoritmo no funciona de esta manera?
A veces me sale IndexError: list assignment index out of range, y cuando no, me devuelve una lista mucho más larga y con elementos repetidos que no corresponden.
def merge_sort(lista): if len(lista) > 1: #Divide la lista en 2 sublistas izquierda = lista[:len(lista)//2] derecha = lista[len(lista)//2:] print(izquierda, '*' * 5, derecha) #Ordeno cada sublista con recursion merge_sort(izquierda) merge_sort(derecha) #Define los iteradores que van a atravesar la lista izquierda, la derecha y la resultante i = 0 d = 0 r = 0 #Compara el primer elemento de cada una de las listas hasta haber atravesado todos los elementos de alguna lista while i < len(izquierda) and d < len(derecha): if izquierda[i] < derecha[d]: lista[r] = izquierda[i] i += 1 else: lista[r] = derecha[d] d += 1 r += 1 # while i < len(izquierda): # lista[r] = izquierda[i] # i += 1 # r +=1 # while d < len(derecha): # lista[r] = derecha[d] # d += 1 # r +=1 if i < len(izquierda): lista[r:] += izquierda[i:] else: lista[r:] += derecha[d:] print(f'izquierda {izquierda}, derecha {derecha}') print(lista) print('-' * 50) return lista```

Clayton Jhordan Iliquin Zavaleta
El problema está en estas lineas de código:
if i < len(izquierda): lista[r:] += izquierda[i:] else: lista[r:] += derecha[d:]
Estas están reemplazando a las que se vio en el algoritmo:
while i < len(izquierda): lista[r] = izquierda[i] i += 1 r +=1 while d < len(derecha): lista[r] = derecha[d] d += 1 r +=1
Ya que estas son la que hacen que los últimos valores que quedan en las sublistas se añadan a la lista final que te regresa los valores ordenados.