資料結構 c 語言版 第三章 列表

2021-10-08 21:34:24 字數 1703 閱讀 3303

向量是連續儲存的,列表是鏈式儲存的。向量有尋秩訪問的能力,隨機查詢迅速,但是插入和刪除效能差。列表的尋位置訪問,隨機查詢效能差,但是插入和刪除效能高

氣泡排序是每輪迴圈,比較左右兩個元素,比較大的交換到後面,所以一輪迴圈能夠保證當前最大的元素一定排到最後面。但是氣泡排序這樣就產生很大的缺點,大量的時間花費在了交換相鄰元素上。

針對氣泡排序的這種缺點,就有了選擇排序。選擇排序原理是,前面一部分元素是沒有排序完成的,後面一部分元素是排序完成的。從前面沒有排序完成的元素中,查詢最大值,然後放到最後面,構成排序完成元素的第乙個。其比較效率與氣泡排序是一樣的,但是沒有那麼多的交換時間,所以選擇排序比氣泡排序效率更高。

課本中選擇排序給出了兩種方案

template

<

typename t>

void list

::selectsorta

(listnodeposi

(t) p,

int n)

//選擇排序版本a

}template

<

typename t>

void list

::selectsortb

(listnodeposi

(t) p,

int n)

//選擇排序版本b

}

其中版本b與版本a最大的區間在於,版本a找到最大值以後,把他插入最後面,同時刪除掉前面的元素。因為對於list而言,插入和刪除都涉及到了記憶體操作,也就是呼叫了new和delete,雖然是線性時間消耗,但是比常規語句執行時間多了100倍左右,不合適。

因此版本b改進了這一缺點,將找到的最大值結點和位於未排序區域的最後乙個結點的資料域進行交換,能夠提高效率。

還要考慮乙個問題就是,為什麼不考慮max是否是位於未排序區域的最後乙個結點呢?如果max是,那麼直接跳過不操作不就行啦,效率不會更高嗎?事實並非如此,因為這種概率太低了,反而會花費時間判斷max是否是最後乙個,得不償失。

再來看看插入排序的實現方法

template

<

typename t>

void list

::insertsort

(listnodeposi

(t)p,

int n)

//插入排序

}

插入排序是假設前面是有序的,後面是無序的,從後面無序區域找到乙個元素,與前面有序區元素進行比較,找到他應該位於的位置上,插入這個位置上。

與選擇排序相比,插入排序具有以下特點

在查詢位置上,向量更有優勢,使用二分查詢可以在o(logn)時間內找到正確位置,但是插入會整體移動陣列,所以插入花銷為o(n),總體複雜度為o(n2)。而列表查詢沒有優勢,需要花費o(n)的時間複雜度進行查詢正確位置,但是插入成本極低,時間複雜度為o(1),最終時間複雜度也是o(n2)。所以可以看來,向量在插入排序上,與列表是相同的,不存在誰更加具有優勢。

向量的插入排序實現如下:

template

<

typename t>

void vector

::insertsort

(int l,

int h)

//插入排序

_elem[rank+1]

= elem;

//rank的位置放入原來在i的元素

}}

(資料結構)第三章 列表

向量中的秩同時對應於邏輯和物理次序,而位置僅對應於邏輯次序。3.3.1 資料結構支援的操作 靜態和動態。size 和get 均可以在常數時間內完成。insert 和remove 均需要線性時間完成。鍊錶是一種典型的動態儲存結構。節點之間通過指標相互索引和訪問。列表是鍊錶結構的一般化推廣,其中的元素稱...

資料結構(C語言版)學習筆記(第三章 棧和佇列)

鏈棧的定義與基本操作 佇列 queue 鏈式佇列的定義與基本操作 初始化鏈式佇列以及佇列的判空 因為棧本質上也是線性表,所以有順序儲存和鏈式儲存兩種儲存方式 typedef int elemtype define maxsize 10 定義棧中元素的最大個數 typedef struct seqst...

第三章列表

listsize 屬性 列表的元素個數 pos 屬性 列表的當前位置 length 屬性 返回列表中元素的個數 clear 方法 清空列表中的所有元素 find 方法 在列表中查詢某一元素 tostring 方法 返回列表的字串形式 getelement 方法 返回當前位置的元素 insert 方法...