1. 程式人生 > ><算法圖解>讀書筆記:第2章 選擇排序

<算法圖解>讀書筆記:第2章 選擇排序

all 單元 大堆 讀書筆記 工作原理 lin 必須 分配內存 thead

第2章 選擇排序

2.1 內存的工作原理

  • 需要將數據存儲到內存時,請求計算機提供存儲空間,計算機會給一個存儲地址.需要存儲多項數據時,有兩種基本方式-數組和鏈表

2.2 數組和鏈表

2.2.1 鏈表

  • 鏈表中的元素可存儲在內存的任何位置
  • 鏈表的每個元素都存儲下一個元素的地址,從而使一系列隨機的內存地址在一起
  • 使用鏈表時,根本就不需要移動元素.只要足夠的內存空間,就能為鏈表分配內存
  • 鏈表的優勢在插入元素方面

    鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。
    來自<百度百科>

2.2.2 數組

  • 鏈表跳躍讀取元素時,需要依次訪問該元素前的元素(獲得下個元素地址),降低了效率.數組中的元素是連在一起的,知道每一個元素的地址,容易做到跳躍讀取元素

    所謂數組,是有序的元素序列。若將有限個類型相同的變量的集合命名,那麽這個名稱為數組名。組成數組的各個變量稱為數組的分量,也稱為數組的元素,有時也稱為下標變量。用於區分數組的各個元素的數字編號稱為下標。數組是在程序設計中,為了處理方便, 把具有相同類型的若幹元素按無序的形式組織起來的一種形式。這些無序排列的同類數據元素的集合稱為數組。
    來自<百度百科>

2.2.3 術語

  • 常見的數組和鏈表操作運行時間

    - 數組 鏈表
    讀取 \(O _{(1)}\) \(O _{(n)}\)
    插入 \(O _{(n)}\) \(O _{(1)}\)
    刪除 \(O _{(n)}\) \(O _{(1)}\)
    • \(O _{(n)}\) 線性時間
    • \(O _{(1)}\) 常量時間

2.2.4 在中間插入

  • 需要在中間插入元素時,鏈表只需要修改它前面的那個元素指向的地址.而使用數組時,則必須將後面的元素都向後移,如果沒有足夠的控件,可能還得將整個數組復制到其它地方

2.2.5 刪除

  • 鏈表刪除元素時只需要修改前一個元素指向的地址即可.而使用數組時,刪除元素後,必須將後面的元素都向前移
  • 不同於插入,刪除元素總能成功.如果內存中沒有足夠的空間,插入操作可能失敗,但在任何情況下能夠將元素刪除
  • 鏈表只能順序訪問,數組支持順序訪問和隨機訪問
  • 數組和鏈表能被用來實現其他數據結構

2.3 選擇排序

選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後,再從剩余未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的數據元素排完。 選擇排序是不穩定的排序方法。
來自<百度百科>

  • 選擇排序的時間復雜度為\(O _{(n)}\)
  • 隨著排序的進行,每次需要檢查的元素數在減少,最後一次需要檢查的元素都只有一個,檢查元素數依次為n-1,n-2,...,2,1.平均檢查的元素為\(\frac{n}{2}\),因此運行時間為\(O _{(\frac{n}{2})}\).但大O表示法省略了諸如\(\frac{n}{2}\)這樣的常數

  • python代碼:

    def selectionSort(arr):
        newArr = []
        for i in range(len(arr)):
            smallest = min(arr)
            newArr.append(smallest)
            arr.remove(smallest)
        return newArr
    
    myList = [5,3,25,6,9,11,1]
    print(selectionSort(myList))

    2.4 小結

  • 計算機內存猶豫一大堆抽屜
  • 需要存儲多個元素時,可使用數組或鏈表
  • 數組的元素都在一起
  • 鏈表的元素時分開的,其中每個元素都存儲下一個元素的地址
  • 數組的讀取速度很快
  • 鏈表的插入和刪除速度很快
  • 在同一個數組中,所有的元素的類型都必須相同

<算法圖解>讀書筆記:第2章 選擇排序