JavaScript-цикл while пропускается, когда условие оценивается как true - PullRequest
0 голосов
/ 04 октября 2018

Как сказал заголовок ... Я практиковался в создании функции сортировки слиянием.кажется, что функция слияния просто пропускает второй или третий цикл while (с добавлением остальных чисел, если один из массивов пуст).

Условие ri

function mergeSort(array) {
  console.log("Array length", array.length);
  if (array.length === 1)
    return array;

  const middle = Math.floor(array.length / 2);
  const right = array.slice(middle, array.length);
  const left = array.slice(0, middle);

  let leftSorted = mergeSort(left);
  let rightSorted = mergeSort(right);
  let merged = merge(leftSorted, rightSorted);
  return merged;
}

function merge(left, right) {

  let ret = [];
  let li = 0,
    ri = 0;
  console.log("leftLength", left.length, "rightlength", right.length);
  while (li < left.length && ri < right.length) {
    console.log("li", li, "ri", ri)
    console.log("left[li]", left[li], "right[ri]", right[ri])
    if (left[li] < right[ri]) {
      console.log("pushing from left");
      ret.push(left[li]);
      li++;
    } else {
      console.log("pushing from right");
      ret.push(right[ri]);
      ri++;
    }
  }

  console.log("li", li, "leftLength", left.length, li < left.length);
  while (li < left.length) {

    console.log("pushing from left");
    ret.push(left[li]);
    li++;
  }

  console.log("ri", ri, "rightLength", right.length, ri < right.length);
  while (ri < right.length) {

    console.log("pushing from right");
    ret.push(right[ri]);
    ri = ri + 1;
  }

  return ret;
}

const list = [2, 5, 1, 3, 7, 2, 3, 8, 6, 3]
console.log(mergeSort(list)) // [ 1, 2, 2, 3, 3, 3, 5, 6, 7, 8 ]

1 Ответ

0 голосов
/ 04 октября 2018

В вашем состоянии while есть опечатка: lenght до length

...