JS模擬陣列操作(新增、刪除、插入、排序、反轉)

潘勇旭發表於2020-01-07

由於 js 沒有 C 語言的指標,所以我們這裡模擬陣列只是模擬陣列操作的思路。

由於本人水平有限,歡迎大家指正,看過能點個贊就更好了,謝謝大家。

先建立一個ArrayList類。

class ArrayList {
  list: any[]
  length: number
  constructor(list = []) {
    this.list = list
    this.length = list.length
  }
 }
複製程式碼

新增(push)

從平時的使用中我們可知,陣列的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))
  }
複製程式碼

歡迎大家進行指導留言,謝謝大家點贊鼓勵支援。

相關文章