2
votes

Fusion de deux tableaux triés avec la boucle 'for' ... comment empêcher 'i' d'augmenter à la fin de la boucle

Je veux fusionner deux tableaux triés en un seul tableau trié, par exemple [1, 3, 6, 7, 11] et [2, 3, 5, 8, 9, 10] fusionnent pour devenir [1, 2, 3, 3, 5, 6, 7, 8, 9, 10, 11 ]. Cependant, je veux faire cela sans aucune méthode de tableau javascript comme .push () ou .concat () afin de me familiariser davantage avec la logique sous-jacente de ces méthodes. Voici mon code.

0
1
2
3
4
5
=> [ 1, 2, 3, 3, 5, 6, 7, 8, 9, 11, 10, undefined ]

Voici ce qui sort sur la console:

const array1 = [1, 3, 6, 7, 11];
const array2 = [2, 3, 5, 8, 9, 10];

const set = (arr, index, value) => {
  return arr[index] = value;
}

const mergeArrs = (arr1, arr2) => {
  let loopLength = arr1.length >= arr2.length ? arr1.length : 
  arr2.length;
  let mergedArr = [];
  for (let i = 0; i < loopLength; i++) {
    if (arr1[i] <= arr2[i]) {
      console.log(i);
      mergedArr = [...mergedArr, set(mergedArr, i, arr1[i]), set(mergedArr, i + 1, arr2[i])];
    } else {
      console.log(i);
      mergedArr = [...mergedArr, set(mergedArr, i, arr2[i]), set(mergedArr, i + 1, arr1[i])];
    }
  }
  return mergedArr;
}

mergeArrs(array1, array2);

Les bits de ma fonction sont corrects, je pense, mais Je rencontre des problèmes tels que les tableaux ne sont fusionnés / triés que par rapport à leur position d'origine. Par exemple. arrayOne [4] = 11 et arrayTwo [4] = 9, donc au début, il va correctement [..., 9, 11, ...] mais ensuite parce que arrayOne n'a pas un index de 5 et arrayTwo en a, arrayTwo [5] = 10, le 10 est cloué sur le tableau après le 11: [..., 9, 11, 10, undefined] et l'indéfini est là car le premier tableau n'a pas d'index de 5 donc c'est undefined ... idk ... Je n'arrive tout simplement pas à comprendre ceci :(

J'apprécierais vraiment toute aide, merci


1 commentaires

Notez qu'avec des valeurs telles que [2, 3, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15] et [1, 4, 9, 16, 25], vous avez besoin de deux indications indépendantes sur une grande partie de chaque tableau a été traitée avant même d'atteindre la fin de l'un ou l'autre.


3 Réponses :


3
votes

Vous pouvez prendre quelques boucles while , car vous pouvez vérifier indépendamment les indices et pousser les valeurs comme vous le souhaitez et incrémenter l'index pour la valeur poussée.

Le premier while code> vérifie les deux indices et contient une vérification pour obtenir une valeur plus petite.

Les autres deux boucles while sont nécessaires pour ajouter les valeurs restantes au fusionné code> tableau.

function merge([v, ...a], [w, ...b]) {
    return v < w
        ? [v, ...(a.length ? merge(a, [w, ...b]) : [w, ...b])]
        : [w, ...(b.length ? merge([v, ...a], b) : [v, ...a])];
}

console.log(...merge([1, 3, 6, 7, 11], [2, 3, 5, 8, 9, 10]));

Une autre approche

var array1 = [1, 3, 6, 7, 11],
    array2 = [2, 3, 5, 8, 9, 10],
    merged = [],
    i = 0,
    j = 0;

while (i < array1.length && j < array2.length) {
    if (array1[i] < array2[j]) {
        merged = [...merged, array1[i++]];
        continue;
    }
    merged = [...merged, array2[j++]];
}

while (i < array1.length) merged = [...merged, array1[i++]];
while (j < array2.length) merged = [...merged, array2[j++]];

console.log(...merged);


0 commentaires

2
votes

Quelques modifications ont été apportées à votre code et cela fonctionne maintenant.

const array1 = [1, 3, 6, 7, 11];
    const array2 = [2, 3, 5, 8, 9, 10];

    const set = (arr, index, value) => {
        return arr[index] = value;
    }

    const mergeArrs = (arr1, arr2) => {
        let loopLength = arr1.length + arr2.length;
        let mergedArr = [];
        for (let i = 0; i <= loopLength; i++) {
            if (arr1.length && arr2.length) {
                if (arr1[0] <= arr2[0])
                    mergedArr = [...mergedArr, set(mergedArr, i, arr1.shift())];

                else
                    mergedArr = [...mergedArr, set(mergedArr, i, arr2.shift())];
            }
            else if (arr1.length) {
                mergedArr = [...mergedArr, set(mergedArr, i, arr1.shift())];
            }
            else if (arr2.length) {
                mergedArr = [...mergedArr, set(mergedArr, i, arr2.shift())];
            }
        }
        return mergedArr;
    }

    console.log(mergeArrs(array1, array2));


0 commentaires

2
votes

Quelque chose avec une boucle while ferait l'affaire. Il vous suffit de comparer chaque élément plus petit tant que les tableaux ne sont pas vides. Et puis vous incrémentez le bon index (celui du tableau contenant la valeur sélectionnée), laissant l'autre inchangé.

function mergeArrs(arr1, arr2) {
    let i = 0,
        j = 0,
        k = 0,
        mergedArr = [];

    //compare as long as they're not empty
    while (i != arr1.length && j != arr2.length) {
        if (arr1[i] > arr2[j])
            mergedArr[k++] = arr2[j++];
        else
            mergedArr[k++] = arr1[i++];
    }
    // empty the remainder
    while (i < arr1.length)
        mergedArr[k++] = arr1[i++];
    while (j < arr2.length)
        mergedArr[k++] = arr2[j++];
    return mergedArr;
}


0 commentaires