单链表之快排
http://fengchangjian.com/?p=1330
快排最核心的思想就是劃分,確定一個樞軸元素(pivot),每一趟劃分的目的就是把待排序列分為兩部分,前一部分比樞軸小(序列A),后一部分比樞軸大(序列B)。經過一趟劃分之后序列變為:{A} pivot {B}。以下是具體步驟:
1、確定每一次劃分的樞軸元素為當前待排序列的頭節點。
2、設置Slow和Fast兩個游標,Slow指向序列A中的最后一個元素,初始化為樞軸本身(待排序列頭節點)。讓Fast遍歷一遍待排序列,當所指元素比樞軸小時,將Slow往前游一格,交換Slow和Fast所指元素的值,這樣仍能保證Slow指向的元素是序列A中的最后一個元素。
3、交換Slow所指元素和樞軸元素的值。
4、對序列A和B重復步驟1~4。
下面是單鏈表快速排序算法的Java實現:
1、單鏈表節點的定義。
/*** @param ListHead 待排序列的頭節點* @param ListEnd 待排序列的尾節點*/ public static void qsort(Element ListHead, Element ListEnd) {if (ListHead == null || ListEnd == null)return;if (ListHead == ListEnd) {return;}//Slow游標,指向序列A的最末尾元素。Element Slow = ListHead;//Fast游標,用于遍歷整個待排序列。Element Fast = ListHead.next;//TempEnd游標,總是指向Slow游標的前驅節點,遞歸調用時需要。Element TempEnd = ListHead;int temp;while (Fast != ListEnd) {//當前節點的值比樞軸小,進行交換。if (Fast.data < ListHead.data) {//TempEnd游標總是指向Slow的前驅。TempEnd = Slow;Slow = Slow.next;//交換Slow和Fast游標所指的元素的值temp = Slow.data;Slow.data = Fast.data;Fast.data = temp;}Fast = Fast.next;}//交換Slow游標所指的元素和樞軸元素的值,使序列成為{A} povit {B}形式temp = ListHead.data;ListHead.data = Slow.data;Slow.data = temp;//遞歸調用qsort(ListHead, TempEnd);qsort(Slow.next, ListEnd); }
上面的代碼有點問題:
總結
- 上一篇: sgi的内存泄露
- 下一篇: sgi stl 之list