--- tags: 資料結構, LeetCode disqus: HackMD --- # 陣列(Array) :::spoiler 文章目錄 [toc] ::: ## 介紹 數據排成一列,儲存在連續的記憶體位置,在大多數的演算法中都經常會使用到,可以把它想像成停車場,每一輛車就是資料,停車格的號碼就是在陣列中的位置。 以下為陣列特性: * 連續的記憶體位置 * 儲存相同類型的資料 * 擁有[緩存局部性](https://en.wikipedia.org/wiki/Locality_of_reference),能夠提高性能 * 隨機訪問速度快 * 插入刪除花費成本較大 ![](https://i.imgur.com/2CKl2Ky.png) (圖片來自於[geeksforgeeks](https://www.geeksforgeeks.org/what-is-array/?ref=lbp)) 在陣列當中就包含元素和索引,如下圖所示 * 元素`Element` - 在陣列當中的每一個位置的項目。 * 索引`Index` - 陣列中元素的每個內存位置都由數字索引標識。 ![](https://i.imgur.com/nnWY6B4.png) ## 陣列 vs. 鏈結串列 | | 存取 | 插入 | 刪除 | | --------- | ---- | ---- | ---- | | 陣列`Array` | 快 | 慢 | 慢 | | 鏈結串列`Linked list` | 慢 | 快 | 快 | ## 複雜度 ### 時間複雜度 | Action動作 | 平均 | 最壞 | | ---------- | ------ | ------ | | 訪問`(Access)` | $O(1)$ | $O(1)$ | | 搜尋`(Search)` | $O(n)$ | $O(n)$ | | 插入`(Insertion)`| $O(n)$ | $O(n)$| | 刪除`(Deletion)` | $O(n)$ | $O(n)$ | ### 空間複雜度 $O(n)$ ## 基本操作 以下為陣列常見操作 * 遍歷: 依次遍歷所有陣列元素。 * 搜索: 使用給定索引或按值搜索元素。 * 插入: 在給定位置添加一個元素。 * 刪除: 刪除給定位置的元素。 * 更新: 更新給定索引處的元素。 * 排序: 按特定順序排列陣列中的元素。 * 合併: 將兩個陣列合併為一個。 * 反轉: 將陣列順序顛倒 ### 遍歷 走訪陣列內每個元素 ```javascript= let array = [1,2,5,3,4,8] for (let i = 0; i < array.length; i++) { console.log(array[i]) } ``` ### 搜尋 給定索引或按值搜索元素 ```javascript= let array = [1,2,5,3,4,8] // 按值搜索元素 let index = array.indexOf(5) console.log(index) // 2 // 給定索引 let element = array[index] console.log(element) // 5 ``` ### 插入 將新的元素插入陣列 ```javascript= let array = [1,2,5,3,4,8] array.splice(2, 0, 6) console.log(array) // [1, 2, 6, 5, 3, 4, 8] ``` ### 刪除 陣列內刪除特定位置的元素 ```javascript= let array = [1, 2, 6, 5, 3, 4, 8] array.splice(2, 1) console.log(array) // [1, 2, 5, 3, 4, 8] ``` ### 更新 更新給定位置的元素 ```javascript= let array = [1, 2, 5, 3, 4, 8] array.splice(2, 1, 7) console.log(array) // [1, 2, 7, 3, 4, 8] ``` ### 排序 排序陣列 ```javascript let array = [1, 2, 7, 3, 4, 8] array.sort() console.log(array) // [1, 2, 3, 4, 7, 8] ``` ### 合併 將A陣列與B陣列組合 ```javascript= let array = [1, 2, 3, 4, 7, 8] let array2 = [9, 10] let array3 = array.concat(array2) console.log(array3) // [1, 2, 3, 4, 7, 8, 9, 10] ``` ### 反轉陣列 將陣列內順序顛倒 ```javascript= let array = [1, 2, 3, 4, 7, 8, 9, 10] array.reverse() console.log(array) // [10, 9, 8, 4, 3, 7, 2, 1] ``` ## 補充 [為什麼緩存位置對陣列性能很重要?](https://stackoverflow.com/questions/12065774/why-does-cache-locality-matter-for-array-performance) [MDN JavaScript Array](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array)