2017-07-10 1 views
0

Je travaille sur l'écriture de ma propre fonction de tri de fusion récursive depuis javascript, mais chaque fois que je la teste avec un tableau de nombres, l'erreur suivante s'affiche: "TypeError: Impossible de lire la propriété 'length' de undefined"Erreur de fonction de tri de fusion récursive: Impossible de lire la propriété 'longueur' de indéfini

Je n'ai aucune idée de la raison pour laquelle je reçois cette erreur, car les seuls endroits où j'utilise la propriété "length" sont sur mon argument arrech (dans la fonction mergeSort) et sur sous-matrices de ce tableau (dans la fonction de fusion). Ma fonction de fusion fonctionne déjà parfaitement lorsqu'elle est testée seule lorsqu'elle reçoit deux tableaux triés de n'importe quelle longueur.

Voici mon code entier:

function merge(arrayOne, arrayTwo){ 
 
    let sorted = [] 
 
    while(arrayOne.length > 0 && arrayTwo.length > 0){ 
 
    if(arrayOne[0] < arrayTwo[0]){ 
 
     sorted.push(arrayOne.shift()); 
 
    } else{ 
 
     sorted.push(arrayTwo.shift()); 
 
    } 
 
    } 
 
    return sorted.concat(arrayOne).concat(arrayTwo); 
 
} 
 

 
function mergeSort(array){ 
 
    let arrayLength = array.length; 
 
    let midpoint = arrayLength/2; 
 
    let firstHalf = array.slice(0, midpoint); 
 
    let secondHalf = array.slice(midpoint, arrayLength); 
 
    if(arrayLength < 2){ 
 
    return array; 
 
    } else{ 
 
    merge(mergeSort(firstHalf), mergeSort(secondHalf)); 
 
    } 
 
}

+2

Avec le code donné, le seul endroit où vous utilisez length est 'while (arrayOne.length> 0 && arrayTwo.length> 0) {' Votre erreur, impossible de lire la longueur de undefined, donc 'arrayOne' et/ou' arrayTwo 'est indéfini – Huangism

Répondre

1

Modifier On dirait que vous avez défini arrayLength dans une édition, la seule question en suspens est que vous devez return merge(...) à la fin de mergeSort

Voici une version corrigée de l'algorithme:

function merge(arrayOne, arrayTwo){ 
 
    let sorted = [] 
 
    while(arrayOne.length > 0 && arrayTwo.length > 0){ 
 
    if(arrayOne[0] < arrayTwo[0]){ 
 
     sorted.push(arrayOne.shift()); 
 
    } else{ 
 
     sorted.push(arrayTwo.shift()); 
 
    } 
 
    } 
 
    return sorted.concat(arrayOne).concat(arrayTwo); 
 
} 
 

 
function mergeSort(array){ 
 
    let arrayLength = array.length; 
 
    let midpoint = arrayLength/2; 
 
    let firstHalf = array.slice(0, midpoint); 
 
    let secondHalf = array.slice(midpoint, arrayLength); 
 
    if(arrayLength < 2){ 
 
    return array; 
 
    } else{ 
 
    return merge(mergeSort(firstHalf), mergeSort(secondHalf)); 
 
    //^*** only required change made here *** 
 
    } 
 
}

Note: Il y a plusieurs autres optimisations qui peuvent être faites, mais ce qui précède est le changement minimal pour votre code nécessaire pour résoudre le bogue. Si vous faites cela comme un exercice d'apprentissage, je vous suggérerais d'examiner d'autres implémentations lorsque vous avez terminé.