【算法】算法圖解筆記_選擇排序

選擇排序是下一章將介紹的快速排序的基石。

內存的工作原理

計算機就像是很多抽屜的集合體,每個抽屜都有地址。
圖片描述
fe0ffeeb是一個內存單元的地址。

【細摳起來,這個圖形有問題:實際上,計算機的內存是一維的,而圖形是二維的。】

需要將數據存儲到內存時,你請求計算機提供存儲空間,計算機給你一個存儲地址。需要存儲多項數據時,有兩種基本方式——數組和鏈表。但它們並非都適用於所有的情形,因此知道它們的差別很重要。

數組和鏈表

數組

數組中所有元素佔用連續的內存,所以通過數組首元素地址,可以計算每個元素的地址。元素的位置稱爲索引,數組的索引從0開始,幾乎所有的編程語言都從0開始對數組元素進行編號。在同一個數組中,所有元素的類型都必須相同(都爲int、double等)。

數組具有以下特點:

  • 知道每個元素的地址,支持隨機訪問方式;時間複雜度O(1)
  • 插入元素時,可能導致元素的移動,最壞情況下,會移動所有元素;由於數組需要連續的內存,當前內存可能無法滿足元素的存儲,需要重新分配內存空間和進行元素的拷貝;插時間複雜度O(n)
  • 刪除元素後,必須將後面的元素都向前移;時間複雜度O(n)

鏈表

鏈表的每個元素都存儲了下一個元素的地址,從而使一系列隨機的內存地址串在一起。鏈表中的元素可存儲在內存的任何地方。只要有足夠的內存空間,就能爲鏈表分配內存。

鏈表具有以下特點:

  • 支持順序訪問方式,只能從第一個元素開始逐個地讀取元素;時間複雜度O(n)
  • 在鏈表中添加元素很容易:只需將其放入內存,並將其地址存儲到前一個元素中;時間複雜度O(1)
  • 刪除元素只需修改前一個元素指向的地址即可;時間複雜度O(1)

圖片描述
數組和鏈表還被用來實現其他數據結構,比如散列表等。

選擇排序

算法思想:遍歷待排序列表,找出最大或最小的元素,並添加到到新列表的第一個位置;然後找第二大或第二小的元素,依次類推,直到待排序列表裏沒有元素爲止,此時新列表的元素已按降序或升序排列。

選擇排序是一種靈巧的算法,但其速度不是很快。需要的總時間爲 O(n × n),即O(n2)。

Python版本:

def findSmallest(arr):
  smallest = arr[0]
  smallest_index = 0
  for i in range(1, len(arr)):
    if arr[i] < smallest:
      smallest = arr[i]
      smallest_index = i
  return smallest_index

def selectionSort(arr):
  newArr = []
  for i in range(len(arr)):
    smallest = findSmallest(arr)
    newArr.append(arr.pop(smallest))
  return newArr

Haskell版本:

import Data.List (delete)

selectionSort :: Ord a => [a] -> [a]
selectionSort []  = []
selectionSort arr =
      let smallest = minimum arr
      in  smallest : selectionSort (delete smallest arr)

請關注我的公衆號哦
圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章