STL中的List排序問題

2021-05-22 09:56:17 字數 1074 閱讀 7881

最近想鑽研一下stl源**,於是照著侯捷的《stl原始碼剖析》看sgi stl,今天想寫寫list的排序演算法。源**如下:

template template

void list<_tp, _alloc>::sort(_strictweakordering __comp)

__carry.swap(__counter[__i]);        

if (__i == __fill) ++__fill;}

for (int __i = 1; __i < __fill; ++__i)

__counter[__i].merge(__counter[__i-1], __comp);

swap(__counter[__fill-1]);}}

侯捷說這是快排演算法!不可思議,雖然第一眼看上去看不出什麼,但第一印象絕對不是快排,多半是合併排序。經過自己的深入研究,現在終於可以打包票了!

首先,要明白 __counter[64] 的含義。__counter[i] 表示長度為 2^i 的一段有序資料,當然是來自於待排序的list。fill 表示現在最大的有序資料長度——2^fill。

每次 carry 從list中獲取乙個資料,和 __counter[0] 合併,並把__counter[0] 的內容給carry,且清空__counter[0]。接著carry和__counter[1] 合併,把__counter[1]賦給carry,清空__counter[1], 以此類推,一直到 __counter[i] 為空,或是 i==__fill(此時carry的長度是 2^(__fill+1) )。接著我們可以看到 __fill ++ 。

我想要注意一下__counter[i] 的長度為空時的情況。此時 carry 的有序資料的個數是 2^i ,但是長度是 2^i 的緩衝區__counter 為空,毫無疑問,我們應該用__counter[i] 儲存 carry 的有序資料。

最後,當list為空時,資料散落在 __counter 中,它們都是有序的,只需要以此合併就可以了。時間複雜度就不用說了。

感覺思路真的很巧妙,自己有必要實現乙個簡單的list,且重點實現排序演算法,算是練練手吧,好久沒敲過**。

睡覺!

STL中list結構體元素排序

stl中list結構體元素排序 include using namespace std 結構體定義 typedef structst list test 比較類 class sortlist less else if stleft.inum1 stright.inum1 else if stleft...

STL的list鍊錶排序

在msvc8.0裡,stl給std list提供了兩種排序方法,乙個是std list的sort成員函式,乙個是裡的std stable sort排序函式。這兩種方法的實現是不同的,list sort 成員函式是針對list容器定製的排序方法,而stable sort是針對bidirectional...

STL中list的使用

stl中list的使用 stl中的list就是一雙向鍊錶,可高效地進行插入刪除元素。現總結一下它的操作。文中所用到兩個list物件c1,c2分別有元素c1 10,20,30 c2 40,50,60 還有乙個list iterator citer用來指向c1或c2元素。list物件的宣告構造 a.li...