單鏈表的快速排序

2021-08-28 17:40:59 字數 1126 閱讀 1182

單鏈表的特點是:單向。

設頭結點位head,則最後乙個節點的next指向null。如果只知道頭結點head,請問怎麼將該鍊錶排序?設結點結構為:

struct node;
那麼一般人見到這種題目,立馬就會想到指標交換。是的,大家被指標交換的題目做多了,形成思維定勢了。對於這道題,我們完全可以利用值交換來達到排序的目的。當然,怎麼值交換?   

很多人得第一想法就是選擇排序,這個木有問題,不過它的複雜度為o(n^2);

有木有更好一點的方法呢?歸併,不錯,歸併確實能將複雜度降到o(nlogn)不過,它是是鍊錶交換的形式,我們這裡提到的是要用值交換的形式。

還有別的方法嗎?對了,快排!怎麼會是快排?快排不是需要乙個指標指向頭,乙個指標指向尾,然後兩個指標相向運動並按一定規律交換值,最後找到乙個支點使得支點左邊小於支點,支點右邊大於支點嗎?是滴,木有錯,不過問題出來了。如果是這樣的話,對於單鏈表我們沒有前驅指標,怎麼能使得後面的那個指標往前移動呢?所以這種快排思路行不通滴。

如果我們能使兩個指標都往next方向移動並且能找到支點那就好了。怎麼做呢?接下來我們使用快排的另一種思路來解答。我們只需要兩個指標p和q,這兩個指標均往next方向移動,移動的過程中保持p之前的key都小於選定的key,p和q之間的key都大於選定的key,那麼當q走到末尾的時候便完成了一次支點的尋找。

如下圖所示:

既然兩個指標都是從前往後遍歷,那麼鍊錶值進行交換就簡單了。找到支點後,支點左邊和支點右邊進行子問題遞迴,就回到快排原來的思路上去了。**如下:

struct node 

};node* getpartion(node* pbegin, node* pend)

q = q->next;

} swap(p->key,pbegin->key);

return p;

}void quicksort(node* pbeign, node* pend)

}

使用時只需呼叫如下**即可

quicksort(phead,null);
結束。

單鏈表快速排序

今天在學習 程式設計師使用演算法 時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...

單鏈表快速排序

今天在學習 程式設計師使用演算法 時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...

單鏈表快速排序

今天在學習 程式設計師使用演算法 時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...