單鏈表快排 改變節點位置

2022-05-01 02:42:06 字數 1308 閱讀 1160

快速排序2(演算法交換鍊錶節點,平均時間複雜度o(nlogn),不考慮遞迴棧空間的話空間複雜度是o(1

))這裡的partition,我們選取第乙個節點作為樞紐元,然後把小於樞紐的節點放到乙個鏈中,把不小於樞紐的及節點放到另乙個鏈中,最後把兩條鏈以及樞紐連線成一條鏈。

這裡我們需要注意的是,

1.在對一條子鏈進行partition時,由於節點的順序都打亂了,所以得保正重新組合成一條新煉表時,要和該子鍊錶的前後部分連線起來,因此我們的partition傳入三個引數,除了子鍊錶的範圍(也是前閉後開區間),還要傳入子煉表頭結點的前驅;2

.partition後鍊錶的頭結點可能已經改變

class

solution

void qsortlist(listnode *headpre, listnode*head, listnode*tail)

}listnode* partitionlist(listnode* lowpre, listnode* low, listnode*high)

else

big->next = high;//

保證子鍊錶[low,high)和後面的部分連線

little->next =low; //負責把中樞紐的元素,插入到我們自己劃分的little和big兩個鍊錶中間,此負責上部分,即little和pivot之間的連線

low->next =node2.next; //同上,負責big鍊錶和pivot之間的連線

lowpre->next = node1.next;//

為了保證子鍊錶[low,high)和前面的部分連線

return

low;

}};

這個方法中little和big所組成的兩個不同鍊錶是有頭節點的,分別是node1,和node2.

快速排序2(演算法交換鍊錶節點,平均時間複雜度o(nlogn),不考慮遞迴棧空間的話空間複雜度是o(1))

這裡的partition,我們選取第乙個節點作為樞紐元,然後把小於樞紐的節點放到乙個鏈中,把不小於樞紐的及節點放到另乙個鏈中,最後把兩條鏈以及樞紐連線成一條鏈。

這裡我們需要注意的是:

1.在對一條子鏈進行partition時,由於節點的順序都打亂了,所以得保正重新組合成一條新煉表時,要和該子鍊錶的前後部分連線起來,因此我們的partition傳入三個引數,除了子鍊錶的範圍(也是前閉後開區間),還要傳入子煉表頭結點的前驅;,由於本身就是前閉後開[   )所以,只需要傳入prev,不需要傳入high。因為本身就有

2.partition後鍊錶的頭結點可能已經改變,通過head的前驅,tmphead(也可以用引用)

快排,非遞迴 單鏈表快排 單鏈表歸併

筆面的高頻問題。又是現場沒答出來,回來再馬後炮 用棧實現 1。每次把支點的右段入棧 當然只記錄該段的起始與結束標記 2。然後繼續對支點的左段重複過程1,若左段的元素小於2個,則不需要再重複1,轉到3 3。左段已排好,從棧中取出最新的右段,轉到1,若棧空則結束。如下 helloworld.cpp 定義...

單鏈表的快排

單鏈表的快排和普通快排都是快排 1.移動數 partition 使得左邊的都小於key,右邊的都大於key 2.反覆 下面是正常陣列的快排 def arr sort self,vector,start,end start,end 0,len vector 1 i,j start end if i j...

單鏈表實現快排

快排的思想 以乙個點為分割點,將陣列分割成前半部分比這個點小,後半部分比這個點大的兩部分,然後再遞迴對這兩半段進行上述同樣的操作,然後合起來 此處一般直接在原陣列中進行操作,交換元素 是一種分治的思想。轉移到鍊錶上 以乙個點為分割點,將鍊錶分割成比這個點大的大鍊錶部分,乙個比這個點小的小鍊錶部分,然...