課程筆記 05 資料結構(清華) 向量 排序

2021-07-03 22:55:04 字數 1575 閱讀 2654

/*--起泡排序--*/

先來看起泡排序的一般版本:

template

void vector::bubblesort(rank lo, rank hi) //演算法框架

//逐趟做掃瞄交換

bool vector::bubble(ranklo, rank hi) //單趟掃瞄交換

bool sorted = true; //整體有序標誌

while (++ lo < hi)

if (_elem[lo - 1] > _elem[lo])

sorted = false; //標記為逆序狀態

swap(_elem[lo], _elem[lo - 1]); //交換亂序對

return sorted; //返回有序標記

假若亂序對僅存在於向量的前方項時,則完全可以通過標記最後端的亂序項來減少掃瞄的數目,從而提高效率,其實現如下:

void vector::bubblesort(rank lo, rank hi) //演算法框架

//逐趟做掃瞄交換

bool vector::bubble(ranklo, rank hi) //單趟掃瞄交換

bool last = hi; //最末逆序項

while (++ lo < hi)

if (_elem[lo - 1] > _elem[lo])

last = lo; //標記為最末逆序項

swap(_elem[lo], _elem[lo - 1]); //交換亂序對

return last; //返回最末逆序項

如此一來,就可以在每趟的掃瞄中出現有序尾項後減少後續的掃瞄量,因此使得許多例項的處理效率大有提高。

/*--歸併排序--*/

我們考察兩段長度分別為m, n 的有序向量時,發現若將其合併成一段,則所用時間為o(m+n)。若我們逆向思考,將乙個長度為n的向量連續二分,則經過logn次的歸併就可以完成排序了。如此一來,整個向量的排序時間為o(nlogn)。

template

void vector::mergesort(rank lo, rank hi) //演算法框架

rank mi = (lo + hi) / 2;

if ( mi ) return; //設定遞迴基

mergesort(lo, mi); //深入前段排序

mergesort(mi, hi); //深入後端排序

merge(lo, mi, hi); //二路並歸

void vector::merge(rank lo, rank mi, rank hi) //主體部分

t & a = new t[mi - lo];

a = _elem[lo];

int la = mi - lo, lb = hi - mi;

int i = 0, j =0, k = 0;

while ( i < la )

if (j <= lb || a[i] <= _elem[j + mi])

_elem[k ++] = a[i ++];

else

_elem[k ++] = _elem[mi + j ++];

delete a;

課程筆記 02 資料結構(清華) 向量

向量是陣列的擴張。二者同是採用順序儲存方式的資料型別,所不同的是向量的封裝性好 抽象度高,具有更好的安全效能與更多的操作介面。在c 環境下,向量模板類可以如下定義 typedef int rank 定義秩 define defualt capacity 定義預設容量 template class v...

課程筆記 08 資料結構(清華) 列表 讀寫介面

在介紹循位置訪問 查詢元素等唯讀操作以及插入 刪除 去重等可寫操作前,先講講初始化方法與複製建構函式的實現。void list init header new listnode tailor new listnode header.succ tailor header.pred null tailo...

資料結構(C ) 向量 筆記1

首先解決第乙個問題。直接在原有的物理記憶體空間的基礎上追加空間,不現實。陣列特定的定址方式,物理空間必須連續,我們無法保證,其尾部總是留有足夠的空間供其擴充套件。一種可行的方法是如上圖所示,申請乙個容量足夠大的陣列,並將原來陣列中的資料進行複製,此後便可以插入新元素e而不至於溢位。當然,原陣列所佔的...