基本類型(棧 stack): Number String Boolean Null Undefined 和 Symbol(es6 新增)
引用類型(堆 heap):Object Array Function Data前端
數據結構是指相互之間存在着一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成es6
有窮性、肯定性、可行性、輸入、輸出算法
正確性、可讀性、健壯性, 時間複雜度, 空間複雜度數組
運行一段程序的計算工做量,時間複雜度即一般所說的算法執行所須要耗費的時間,時間越短,算法越好。可是,一個算法的執行時間每每沒法精確估計。一般須要在實際的計算機運行才知道具體的執行時間。可是,也能夠大體進行估計,獲得算法的時間複雜度。算法的執行時間每每和算法代碼中語句執行的數量有關。數據結構
運行一段程序的內存佔用,空間複雜度一般指的是算法程序在計算機只想中只想所須要的存儲空間。.net
eg:設計
O(1):常數運算code
O(n):1 層循環blog
O(n^2):2 層循環排序
O(n^n):n 層循環
O(log2n):int i = 1, n = 100;while(i < n){ i = i * 2;}
原理:每次把最大或者最小的浮到最頂層
let arr = [33, 1, 46, 23, 35, 12, 30, 4, 16, 2] function bubbleSort(array) { for (var i = 0; i < array.length; i++) { for (var j = 0; j < array.length - i - 1; j++) { if (array[j] > array[j + 1]) { var temp = array[j] array[j] = array[j + 1] array[j + 1] = temp } } } return array }
原理:從數組的第二個和第一個比較,若是小於第一個則插入到第一個元素以前,不然不變
第三個一次和第二個第一個比,若是小於第二個且大於第一個則插入第二個元素以前
let arr = [33, 1, 46, 23, 35, 12, 30, 4, 16, 2] function insertionSort(arr) { var len = arr.length var preIndex, current for (var i = 1; i < len; i++) { preIndex = i - 1 current = arr[i] while (preIndex >= 0 && arr[preIndex] > current) { arr[preIndex + 1] = arr[preIndex] preIndex-- } arr[preIndex + 1] = current } return arr }
原理:從數組的第一個開始,向後比較,找到最小的和第一個交換
let arr = [33, 1, 46, 23, 35, 12, 30, 4, 16, 2] function selectionSort(arr) { var len = arr.length var minIndex, temp for (var i = 0; i < len; i++) { minIndex = i for (var j = i + 1; j < len; j++) { if (arr[minIndex] > arr[j]) { minIndex = j } } temp = arr[i] arr[i] = arr[minIndex] arr[minIndex] = temp } return arr }
排序方法 | 時間複雜度(最壞) | 時間複雜度(最好) | 空間複雜度 | 穩定性 | 複雜性 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n) | O(1) | 穩定 | 簡單 |
插入排序 | O(n^2) | O(n) | O(1) | 穩定 | 簡單 |
選擇排序 | O(n^2) | O(n^2) | O(1) | 不穩定 | 簡單 |