Почему метод slice включает в этот код аргумент end? - PullRequest
0 голосов
/ 16 апреля 2020

Я наткнулся на это видео, объясняющее сортировку слиянием в javascript https://www.youtube.com/watch?v=ppNZ4bmrmGs&t=195s

Насколько мне известно, метод slice () выбирает элементы, начиная с заданного аргумента начала, и заканчивается в, но не включает , данный конечный аргумент. Так почему же, когда этот человек пытается создать переменную для подмассива, хранящего индекс 0 до конечного аргумента, он включает конечный аргумент? :

const leftSide = array.slice(0, middle);
const rightSide = array.slice(middle, array.length);

Вот остаток кода:

const mergeSort = array => {
  //Check if array can be split
  if(array.length < 2) return array;
  //Get Middle index
  const middle = Math.floor(array.length / 2);
  //Split Array In Two Sides
  const leftSide = array.slice(0, middle);
  const rightSide = array.slice(middle, array.length);
  //Use recusion to continue splitting
  console.log('split:', leftSide, rightSide);
  return merge(mergeSort(leftSide), mergeSort(rightSide));
}

const merge = (left, right) => {
  //Create New Array
  const result = [];
  //Check if left array and right array is empty
  while(left.length && right.length) {
    //Find lower value
    if(left[0] <= right[0]) {
      //Add left value
      result.push(left.shift());
    } else {
      //Add right value
      result.push(right.shift());
    }
  }
  //Merge left array
  while(left.length) result.push(left.shift());
  //Merge right array
  while(right.length) result.push(right.shift());
  //return result array
  console.log('result:', result);
  return result;
}

console.log(mergeSort([5, 3, 7, 10, 4, 1, 5]));

1 Ответ

1 голос
/ 16 апреля 2020

Результатом индексов, начинающихся с 0 в большинстве языков кодирования, является то, что вы можете получить доступ к первым n элементам, взяв все элементы, индекс которых меньше n. За этим следует большинство механик языков программирования, например, свойство inclusive-exclusive таких функций, как splice. Посмотрите, как будет разбиваться ваш тестовый массив:

5 3 7 10 4 1 5

Для списков четной длины разбить на 2 просто; обе стороны будут иметь одинаковую длину. Для списков нечетной длины вы должны сделать выбор левой стороны больше или правее, и в этой реализации было выбрано право (таким образом, использовалось floor). Длина равна 7, поэтому middle установлен на пол (7/2) = 3. Это означает, что левая сторона разделения должна иметь длину 3 (то есть 5 3 7) и длину правой стороны 4. Если вы посчитаете индексы, вы обнаружите, что 7 имеет индекс 2. Поэтому, если вы разбиваете от 0 до 3 включительно-эксклюзивно, вы включаете все, вплоть до 3-го элемента или 2-го индекса, что и является желательным.

...