快排的思想:以乙個點為分割點,將陣列分割成前半部分比這個點小,後半部分比這個點大的兩部分,然後再遞迴對這兩半段進行上述同樣的操作,然後合起來(此處一般直接在原陣列中進行操作,交換元素),是一種分治的思想。
轉移到鍊錶上:以乙個點為分割點,將鍊錶分割成比這個點大的大鍊錶部分,乙個比這個點小的小鍊錶部分,然後縮小範圍,遞迴~
public
class 鍊錶實現快排
;//獲取煉表頭節點
node head =
buildlinkedlist
(nums)
;//列印看看鍊錶是否建立成功
//print(head);
//獲取鍊錶尾結點
system.out.
println()
;quicksort
(head,null)
;//再次列印看看是否排好序了
print
(head);}
public
static node getpartion
(node head,node end)
q = q.next;
}swap
(p, head)
;return p;
}public
static
void
swap
(node p,node q)
public
static
void
quicksort
(node head,node end)
}public
static node buildlinkedlist
(int
nums)
return head;
}public
static
void
print
(node head)}}
class
node
}
單鏈表的快排實現
分析 因為單鏈表只能單向前進,所以不能採用常見的快排模式。我們只需要兩個指標p和q,初始分別為head和head.next,這兩個指標均往next方向移動,移動的過程中保持p之前的key都小於選定的key,p和q之間的key都大於選定的key,那麼當q走到末尾的時候便完成了一次支點的尋找。後面每個部...
快排,非遞迴 單鏈表快排 單鏈表歸併
筆面的高頻問題。又是現場沒答出來,回來再馬後炮 用棧實現 1。每次把支點的右段入棧 當然只記錄該段的起始與結束標記 2。然後繼續對支點的左段重複過程1,若左段的元素小於2個,則不需要再重複1,轉到3 3。左段已排好,從棧中取出最新的右段,轉到1,若棧空則結束。如下 helloworld.cpp 定義...
用快排思想實現單鏈表
演算法思想 對於乙個鍊錶,以head節點的值作為key,然後遍歷之後的節點,可以得到乙個小於key的鍊錶和大於等於key的鍊錶 由此遞迴可以對兩個鍊錶分別進行快速。這裡用到了快速排序的思想即經過一趟排序能夠將小於key的元素放在一邊,將大於等於key的元素放在另一邊 面試回答 如果面試官問快速排序是...