由於 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))
}
複製程式碼
歡迎大家進行指導留言,謝謝大家點贊鼓勵支援。