-2
votes

Fusionner Trier dans la question Python

def mergeSort(A, l, r):
    if l < r:
        mid = (l + r) // 2
        mergeSort(A, l, mid)
        mergeSort(A, mid + 1, r)
        merge(A, l, mid, r)

def merge(arr, l, mid, r):
    arr1 = []
    arr2 = []

    for i in range(mid):
        arr1.append(arr[i])

    for j in range(mid, r):
        arr2.append(arr[j])

    i = 0
    j = 0
    k = 0

    while (i < len(arr1) and j < len(arr2)):
        if arr1[i] < arr2[j]:
            arr[k] = arr1[i]
            i += 1
        else:   
            arr[k] = arr2[j]
            j += 1
        k += 1

    while i < len(arr1):
        arr[k] = arr1[i]
        i += 1
        k += 1

    while j < len(arr2):
        arr[k] = arr2[j]
        j += 1
        k += 1


arr = [2, 9, 7, 6, 1, 8, 4, 3]
mergeSort(arr, 0, 8)

print(arr)
There's a slight mistake somewhere in the code that I'm not able to find
Please try to run this code on your machine with different test cases.
And Let me know what I'm doing wrong here.
I don't know why I'm getting an incorrect answer: [1, 2, 3, 4, 6, 8, 9, 7]

2 commentaires

Avez-vous essayé de déboguer votre code?


Bien sûr que je l'ai fait


3 Réponses :


0
votes
    else:   
        arr[k] = arr2[j]
        j += 1
k += 1

1 commentaires

Non, ça ne marche pas. Ce que vous impliquant est la même chose que j'ai déjà fait



0
votes

Vous avez des problèmes avec des index. Vous avez écrit du code dans le style C. Utilisez simplement des tranches pour résoudre votre problème

Modifier la définition (Supprimer des boucles pour ARR1 et ARR2) pour ARR1 et ARR2 sur: P>

arr1 = arr[:mid]
arr2 = arr[mid:]


2 commentaires

Bien sûr, cela me donne la sortie correcte. Mais, qu'est-ce qui n'allait pas avec mon code


J'ai bien peur que cela ne fonctionne que par coïncidence. L'initialisation doit être arr1 = arr [l: moyen] et arr2 = arr [milieu: r] mais il existe d'autres problèmes dans Mergesort () .



0
votes

Il y a plusieurs problèmes dans votre code:

  • Vous transmettez l'index du premier élément à trier et l'index une fois passé le dernier élément de la tranche, mais vous avez écrit la fonction Mergesort avec différentes sémantiques que vous supposez r être l'index du dernier élément de la tranche.
  • de la même manière, fusion attend que l'argument moyen est le début de la moitié droite et que vous passez moyen , qui serait l'index à le dernier élément de la première moitié de votre approche.
  • dans la fonction fusion , arr1 doit être initialisé avec i variant de l à MID , avec pour i in gamme (L: mi-temps):
  • En outre, k doit être initialisé à l , pas 0 .
  • Notez que arr1 et Arr2 pourrait être initialisé à partir de tranches simples de Arr . .

    Voici une version modifiée: xxx

    sortie: xxx


0 commentaires