JS имитирует операции с массивами (добавление, удаление, вставка, сортировка, реверс)

JavaScript

из-заjsнетCУказатель языка, поэтому мы моделируем массив здесь, это просто идея моделирования работы массива.

Из-за моего ограниченного уровня, пожалуйста, поправляйте меня, похоже, можно указать лучше, спасибо.

сначала создайтеArrayListДобрый.

class ArrayList {
  list: any[]
  length: number
  constructor(list = []) {
    this.list = list
    this.length = list.length
  }
 }

Добавить (нажать)

Из обычного использования мы знаем, что массивpushМетод состоит в том, чтобы добавить элемент в последний бит массива, и длина массива станетthis.length + 1, индекс массива последней цифры массива равенthis.length. Итак, наш новый метод можно записать так:

appendChild(item: any) {
    this.list[this.length] = item
    this.length++
 }

удалить (указать индекс удаляемого элемента)

Предположим, что удаленный элемент индексируется какi

  • Сначала найдите элемент, который нужно удалитьthis.list[i]
  • Индексы элементов массива изiНачинать,this.list[i] = this.list[i + 1], элемент удаляется, а все последующие элементы сдвигаются на один бит вперед.
  • Изменить длину массива
  • Возвращает удаленный элемент
removeChild(index: number) {
    let removeItem = this.list(index)
    let length = this.length
    // 从被删除的元素开始向前移动
    for (let i = index; i < length - 1; i++) {
      this.list[i] = this.list[i + 1]
    }
    // 删除最后一个空位
    delete this.list[length - 1]
    this.list.length--
    this.length--
    return removeItem
  }

обратный

  • установить две переменныеi,j, соответствующие началу и хвосту массива, который нужно поменять местами
  • поменять местами голову и хвост,i++, j--
  • когдаi >= jКогда остановился своп
  • вернуть новый массив
 // 反转
  inversion(arys = null) {
    let list = arys || this.list
    let length = list.length - 1
    // i 代表 头, j 代表尾部下标
    let i = 0, j = length - i, t: any;
    while (j > i) {
      t = list[i]
      list[i] = list[j]
      list[j] = t
      i++
      j--
    }
    return list
  }

вставлять

Этот метод принимает два параметра: индекс позиции вставки и вставляемый элемент.

  • получить длину массива
  • Переместить элемент во вставленной позиции на одну позицию назад, начиная с последнегоthis.list[length] = this.list[length - 1]
  • Вставьте элемент в позицию каретки
  • Изменить длину массива
// 插入
  insert(index: number, item: any) {
    let length = this.length
    // 从最后一位依次移动元素至被插入下标前一位
    for (let i = length; i > index; i--) {
      this.list[i] = this.list[i - 1]
    }

    this.list[index] = item
    this.length++
    return true
  }

Сортировка (быстрая сортировка)

  • Найдите индекс базового значения отсортированного массива (найдите среднюю цифру, упростите операцию)
  • Найдите эталонное значение по индексу
  • Прокрутите массив, поместите число больше эталонного значения вrightМассив, в который помещается число, меньшее эталонного значенияleftмножество
  • правильноright、leftМассив, рекурсивный обход и сортировка
  • выходleft + 基准值 + rightмассив
 quicksort(arys, ) {
    const ary = arys.slice(0)
    if (ary.length <= 1) {
      return ary
    }
    // 基准值下标
    let pivotIndex = Math.floor(ary.length / 2);
    基准值
    let pivot = ary.splice(pivotIndex, 1);
    const left = [], right = [];

    for (let i = 0; i < ary.length; i++) {
        //当前元素大于基准值
      if (ary[i] > pivot) {
        right.push(ary[i])
      } else {
        left.push(ary[i])
      }
    }
    return this.quicksort(left).concat(pivot, this.quicksort(right))
  }

Добро пожаловать, чтобы оставить сообщение для руководства, спасибо за вашу поддержку.