資料結構 鍊錶排序

2021-09-11 21:50:18 字數 1301 閱讀 4918

問題:我們需要將乙個無序的單鏈表在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序

時間複雜度為穩定o(n log n)的排序只有堆排序與歸併排序,但是堆排序需要建堆,那麼鍊錶有n個節點我們就需要開闢長度為n的陣列來存放節點,所以我們選擇歸併排序,我們知道普通的歸併排序需要開闢乙個tmp陣列來存放臨時資料,但是因為我們這裡對鍊錶進行排序不需要臨時陣列,所以我們使用的空間為常數個。

1.歸併排序是二分的思想,所以我們需要遞迴的進行對鍊錶進行分割

2.二分二分的分割鍊錶需要找到中間的節點,所以我們使用快慢指標法

3.直到將鍊錶分割成以節點為單位時,將所有的鍊錶進行合併

;//二分的一直將鍊錶拆成以節點為單位

listnode* newright =

sortlist

(right)

;//將鍊錶合成乙個新的排序鍊錶

listnode* newhead;

//要返回的新頭節點

listnode* tail;

//需要乙個尾節點方便尾插操作

//尋找倆個節點中小的那乙個作為頭節點

if(newleft->val < newright->val)

else

tail = newhead;

tail->next = nullptr;

//合併剩餘的鍊錶,原理與合併兩個排序相同(因為此時我們的鍊錶已經時排序的了)

while

(newleft && newright)

else

}//沒有走到尾的鍊錶直接插入到tail之後即可

if(newleft)

if(newright)

return newhead;

//將頭節點返回給上級呼叫函式的newleft或者newright}}

;

資料結構鍊錶氣泡排序

結束語6000字文章,建議先自上而下的劃分函式,讀者先自己實現一下功能,然後再看該文章才會目標明確,有方向感。這裡採用鍊錶氣泡排序,需要有二級指標和鍊錶的基礎。單鏈表 排序 author 趙雨騰 data 12th march 2020 input 49 38 65 97 76 13 27 49 1...

資料結構 鍊錶

鍊錶 what 就是一張鏈式儲存的表,是一種資料結構,是基礎,所以還是不要想有什麼用。具體呢?在c中就用結構體實現物件描述,然後通過函式來實現各個基本操作 c 則用類來表述,c中的結構體就可以看成c 中的類,然後通過類封裝各個操作步驟。這些操作實現後就需要 來測試,號稱demo,就是main函式裡面...

資料結構 鍊錶

鍊錶中的資料是以節點來表示的,每個結點的構成 元素 資料元素的映象 指標 指示後繼元素儲存位置 元素就是儲存資料的儲存單元,指標就是連線每個結點的位址資料。鍊錶的結點結構 data next data域 存放結點值的資料域 next域 存放結點的直接後繼的位址 位置 的指標域 鏈域 以 結點的序列 ...