算法圖解第二章--選擇排序法(數組,鏈表的進一步理解)(學習筆記)


如果想更好的理解本文章,你可以看往期文章。
一、算法圖解第一章(二分查找法,運行時間,大O表示法)

一、數組

1、首先,應該都瞭解數組吧,它申請的內存都是連續在一起的。

2、爲了更好的理解,我們以例子來講解。假如你和朋友們去電影院看電影,你們一共有3個人,此時計算機爲你們分配了連續的3個位置,但此時又來了一位朋友,但你們現在坐的位置已經沒有了位置(就是沒辦法坐在一起了),如圖
在這裏插入圖片描述

此時如果你是數組,你該怎麼辦呢?你就會請求計算機重新分配能容納4個人的連續的內存,找到後你們四個人便移動到新位置,那如果又來一個人呢?你就會重新讓計算機再找位置,再一起移動到新位置,是不是如此的麻煩。而面對此情況一種解決方法是“預留座位”,也就是即便你只有三個人,我也要讓計算機給我找能容納10個人的位置,這樣只要不超過10個人就可以。
但它有如下兩個缺點:

1、你額外請求的位置可能根本用不上,這將浪費內存,別人也用不了。

2、你需求的內存超過10個後,你還得轉移。

因此,解決此類問題,我們可以用鏈表來解決。

二、鏈表

1、鏈表中的元素可儲存在內存的任何地方

2、如果你不瞭解鏈表,你可以先知道鏈表裏有2部分,數據域和指針域。

3、在這裏我們主要是瞭解指針域,指針域是存放下一個元素的地址,從而使一系列元素串在一起。

補充:
你可以這樣理解,猶如尋寶遊戲,你前往第一個地址,那裏有一張紙條,上面寫着“下一個元素的地址”,你再到第二個元素那裏,那裏又有下一個元素的地址,以此類推。如果你要在末尾添加元素,你只需要把上一個元素的指針域存儲新添元素的地址即可

三、數組與鏈表的優缺點

那我們什麼時候用鏈表呢?什麼時候用數組呢?相信上面的分析你已經心中有一些想法。

如果你要在數據中間插入元素,應該選擇鏈表,你只需要將新元素的指針域指向它前面元素的指針域指向的那個地址,然後將它前面的那個元素的指針域指向新元素即可。

那爲什麼不用數組呢?因爲如果要在數組中間插入元素,則必須將它後面的元素都向後移動,如果沒有足夠的空間,可能還得將這個數組複製到其他地方。所以,當需要在中間插入元素時,鏈表是更好的的選擇。

如果要刪除元素呢?鏈表也是更好的選擇,因爲只需要修改前一個元素指向的地址即可。而使用數組時,刪除元素後,必須將後面的元素都向前移。

四、順序訪問和隨機訪問

數組沒有優勢嗎?這裏將體現數組的優勢。

順序訪問意味着從第一個元素開始逐個地讀取元素,鏈表只能順序訪問,這意味着,你如果要讀取第十個元素,你必須先讀取前9個元素,並沿鏈接找到第十個元素。

隨機訪問意味着可直接跳到第十個元素,數組則支持隨機訪問,所以需要隨機地讀取元素時,數組的效率很高。而且很多情況要求能夠隨機訪問,所以數組用的很多。

五、選擇排序

選擇排序就是不斷地從未排序的元素中選擇最大(或者最小)的元素放入已經排好序的元素中,直到未排序中僅剩下一個元素爲止。用一個實例進行理解:
對一個列表進行排序:
基本思想就是假設第一個位置上的爲最大,然後依次去和下面的進行比較,如果發現比第一個位置數大的,那就記下來它的編號J(因爲不確定後面有沒有比它大的數了,應當循環完,找出最大數的編號,再進行交換,這樣只需要交換一次)。

List=[15,16,17,66,55,11,88]
for i in range(0,6):    #k+1應該小於7,所以這裏的k又等於i,所以小於6
    k=i
    for j in range(k+1,7):
        if List[k]<List[j]:
            k=j
    if k!=i:
        team=List[k]
        List[k]=List[i]
        List[i]=team
print(List)

結果:

[88, 66, 55, 17, 16, 15, 11]

六、運行時間

上面的選擇排序,若有n個元素,這裏需要的運行時間爲O(n2n^2),你如果理解了選擇排序或看懂了代碼,你會有疑問。
隨着排序的進行,每次需要檢查的元素數在逐漸減少,最後一次需要檢查的元素都只有一
個。既然如此,運行時間怎麼還是O(n2n^2)呢?

這與大O表示法中的常數相關。理解的不錯,並非每次都需要檢查n個元素。第一次需要檢查n個元素,但隨後檢查的元素數依次爲n - 1, n – 2, …, 2和1。平均每次檢查的元素數爲1/2 ×( n+1),共有n次,因此運行時間爲O(n × 1/2 × (n+1))。
但大O表示法省略諸如1/2這樣的常數(有關這方面的完整討論,後面的篇幅會有詳解,這裏就簡單說一下),因此簡單地寫作O(n × n)或O(n2n^2)。

結語:

算法圖解這本書正在學習,如果有志同道合的朋友可以一起學習。如果哪裏有不足,可以留言指正。
這本書的電子版可以去我主頁簡介裏有獲取方法。

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