【算法初探】數組、鏈表與選擇排序

前端也要懂算法,閱《算法圖解》有所得。

1、數組與鏈表

1. 內存的原理:

相信咱們常常會聽到「堆」、「棧」之類的字眼,那麼計算機的內存是什麼呢?當咱們去游泳時,咱們須要將東西存在保險櫃裏,可能東西比較多,一個放不下,這時候就須要申請2個保險櫃,再將東西放在櫃子裏,手裏拿着開櫃的鑰匙。前端

計算機的內存分配亦是如此,當咱們須要使用內存時,咱們須要申請空閒內存,再將數據存入申請的內存裏,最終獲得存放數據的內存地址。若是咱們須要訪問一個數據,只須要知道數據存放的地址,就能訪問。算法

2. 數組與鏈表

數組和鏈表是計算機最基礎的2種數據結構。假如咱們須要將5個數據放入內存中,那麼計算機須要分給咱們5個內存空間,那麼使用數組和鏈表的區別是什麼呢?數組

1)數組

若是使用數組存儲,那麼咱們須要計算機分配5個相鄰的內存空間,由於數組的每一個元素都是有序且相鄰的。此時,咱們很容易發現,若是我須要往數組裏插入一個元素,那麼咱們可能會面臨以下困境:數據結構

  • 相鄰的內存被其餘數據佔用了。
  • 計算機剩餘的相鄰內存長度不足以放下數組

若是使用鏈表來存儲,以上問題將會迎刃而解。性能

2)鏈表

一樣,以鏈表的形式存儲5個元素,每一個元素都記錄着下一個元素的地址,那麼只須要知道一個元素,就能獲得整個鏈表,而不須要每一個元素都相鄰。
這樣咱們插入一個新元素,只須要改變上一個元素記錄的地址。
固然,事情不會這麼簡單,數組與鏈表各有優劣。code

3)優劣

上篇文章介紹了大O計數法表示一個算法的速度,那麼咱們來看看數組與鏈表插入、刪除、和查找一個元素的速度:排序

數組      鏈表
查找    O(1)      O(n)
插入    O(n)      O(1)
刪除    O(n)      O(1)

顯而意見,數組在查找操做上的性能較高,由於數組的每一個元素都是相鄰的,從而支持隨機查找,即若是知道了第一個元素,那麼第4個元素的位置也能猜到。相反,鏈表存儲的數據則須要從頭開始查找,由於只有前一個元素才知道後一個元素的位置。
同理: 對於插入和刪除, 鏈表只須要修改上一個元素的地址,而數組若是插入的數據是中間的,則須要對後面全部的元素進行補位。內存

由此,很容易得出結論:io

  • 數組比較適合查詢多,增刪少的場景
  • 鏈表多用於增刪頻繁而不須要常常查找的數據存儲。

2、選擇排序

1. 原理

選擇排序的思想是,若是有一組數據須要從大到小排序,那麼先找出最大的,移除,再在剩下的數中找第二大的,依次類推。其算法速度:O(n^2)function

2. js實現

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;
}
相關文章
相關標籤/搜索