感覺鍊錶的快速排序也挺好寫的,甚至比陣列更容易理解,但不知道為什麼看到很多人都說快排不適合單鏈表結構的資料。
取第乙個元素為哨兵,遍歷鍊錶,將小於、等於、大於的元素分成3個子鍊錶;
遞迴整理「小於」鍊錶;
遞迴整理「大於」鍊錶;
將3個鍊錶連線起來。
**實現如下:
//鍊錶快速排序,返回最後乙個元素的位址
mynode* quicksortforlist(mynode* &head)
else if(pt->val == pivot->val)
else
}ls_pt->next=nullptr;//鍊錶最後乙個元素指向空指標
eq_pt->next=nullptr;
bg_pt->next=nullptr;
bg_pt=quicksortforlist(bg_head->next);//
if(ls_pt) //如果小於哨兵的鍊錶不為空,則將3個鍊錶首尾鏈結在一起
else
delete ls_head;
delete bg_head;
//如果大於哨兵的鍊錶不為空返回該鍊錶的最後乙個元素的位置
//否則返回等於哨兵的鍊錶的最後乙個元素的位置
if(bg_pt) return bg_pt;
else return eq_pt;
}
mynode定義:
class mynode
;
鍊錶快速排序
對陣列中的元素按照從小到大的順序快速排序 void quicksort int a,int left,int right left和right分別是雙向鍊錶開頭和結尾的元素指標 void ranklist stu left,stu right while l r l score value l l ...
C語言 雙向鍊錶的快速排序
之前一直想用雙向鍊錶來快排,想像陣列快排一樣給第乙個陣列下標 第乙個有值節點的指標 和最後乙個陣列下標 最後乙個有值節點指標 結果執行時經常有問題,程式有時會出錯,於是紙上演算了幾次發現會訪問到未知的記憶體.因為當low和high在最左側或者最右側相同時,再經過一次呼叫時 box qsort i,l...
鍊錶劃分 引申到快速排序
題目 給定乙個鍊錶和乙個值x,將鍊錶劃分成兩部分,使得劃分後小於x的結點在前,大於等於x的結點在後。在這兩部分中要保持原煉表中的出現順序。如 給定鍊錶1 4 3 2 5 2和x 3,返回 1 2 2 4 3 5。新建兩個指標p1和p2。遍歷一遍鍊錶 第乙個1 比3小,放在p1後面 p1 1 第二個4...