前端也要懂算法,閱《算法圖解》有所得。
相信咱們常常會聽到「堆」、「棧」之類的字眼,那麼計算機的內存是什麼呢?當咱們去游泳時,咱們須要將東西存在保險櫃裏,可能東西比較多,一個放不下,這時候就須要申請2個保險櫃,再將東西放在櫃子裏,手裏拿着開櫃的鑰匙。前端
計算機的內存分配亦是如此,當咱們須要使用內存時,咱們須要申請空閒內存,再將數據存入申請的內存裏,最終獲得存放數據的內存地址。若是咱們須要訪問一個數據,只須要知道數據存放的地址,就能訪問。算法
數組和鏈表是計算機最基礎的2種數據結構。假如咱們須要將5個數據放入內存中,那麼計算機須要分給咱們5個內存空間,那麼使用數組和鏈表的區別是什麼呢?數組
若是使用數組存儲,那麼咱們須要計算機分配5個相鄰的內存空間,由於數組的每一個元素都是有序且相鄰的。此時,咱們很容易發現,若是我須要往數組裏插入一個元素,那麼咱們可能會面臨以下困境:數據結構
若是使用鏈表來存儲,以上問題將會迎刃而解。性能
一樣,以鏈表的形式存儲5個元素,每一個元素都記錄着下一個元素的地址,那麼只須要知道一個元素,就能獲得整個鏈表,而不須要每一個元素都相鄰。
這樣咱們插入一個新元素,只須要改變上一個元素記錄的地址。
固然,事情不會這麼簡單,數組與鏈表各有優劣。code
上篇文章介紹了大O計數法表示一個算法的速度,那麼咱們來看看數組與鏈表插入、刪除、和查找一個元素的速度:排序
數組 鏈表 查找 O(1) O(n) 插入 O(n) O(1) 刪除 O(n) O(1)
顯而意見,數組在查找操做上的性能較高,由於數組的每一個元素都是相鄰的,從而支持隨機查找,即若是知道了第一個元素,那麼第4個元素的位置也能猜到。相反,鏈表存儲的數據則須要從頭開始查找,由於只有前一個元素才知道後一個元素的位置。
同理: 對於插入和刪除, 鏈表只須要修改上一個元素的地址,而數組若是插入的數據是中間的,則須要對後面全部的元素進行補位。內存
由此,很容易得出結論:io
選擇排序的思想是,若是有一組數據須要從大到小排序,那麼先找出最大的,移除,再在剩下的數中找第二大的,依次類推。其算法速度:O(n^2)function
function selectionSort(myArray){ var len = myArray.length, min; for (i = 0; i < len; i++){ // 將當前位置設爲最小值 min = i; // 檢查數組其他部分是否更小 for (j = i+1; j < len; j++){ if (myArray[j] < myArray[min]){ min = j; } } // 若是當前位置不是最小值,將其換爲最小值 if (i != min){ swap(myArray, i, min); } } return myArray; } function swap(myArray, p1, p2){ var temp = myArray[p1]; myArray[p1] = myArray[p2]; myArray[p2] = temp; }