list不能使用stl演算法sort(),必須使用自己的sort()member function,因為stl演算法sort()只接受randomaccessiterator,而list提供的是
bidirectional iterators
演算法描述:
templatevoid list::sort()
templatetemplatevoid list::sort(compare comp)
carry.swap(counter[i]);
if (i == fill)
++fill;
} for (int i = 0; i != fill; ++i)
swap(counter[fill - 1]);
}}
步驟一:
list carry;
list counter[64];
這是一些空鍊錶,用於輔助操作
*this是待排序的list
步驟二:
carry.splice(carry.begin(),*this,begin());
每次都是將*this鍊錶中的首元素移入空鍊錶carry中,並在*this中刪除移走的元素
步驟三:
現在i=fill=0,不滿足while (i < fill && !counter[i].empty())
執行carry.swap(counter[0]);
然後將fill置為1
這樣一次while(!empty())執行完畢,開始下一輪
步驟一:
carry.splice(carry.begin(),*this,begin());
同上,將*this中的首元素拼接到carry中
步驟二:
counter[0].merge(carry,comp);
此時,進入內層while迴圈,將鍊錶carry中的元素合併(按comp方式進行合併,比如
carry.swap(counter[i++]);
將鍊錶carry與counter[0]進行交換
步驟三:
現在i=fill=1,不滿足while (i < fill && !counter[i].empty())
執行carry.swap(counter[1]);
然後將fill置為2
最後對3的處理也是同理
總之,每次執行完一次while,鍊錶carry總是為空鍊錶,而鍊錶counter[i]中存放目前sort好的元素,鍊錶list[i-1]...list[0]為空鍊錶。直到最後把所有元素都按照comp方式排好序
最後,swap(counter[fill-1]);
也就是把排好序的所有元素再換回*this中
STL中關於list容器的sort函式詳解
因為在stl中stl algo中提供有sort函式,他的函式原型 template inline void sort randomaccessiterator first,randomaccessiterator last template inline void sort randomaccess...
stl中list的sort演算法實現
stl中有乙個std sort演算法,但它是不支援std list的,因為list不提供randomiterator的支援,但list自己提供了sort演算法,把list的元素按從小到大的方式來排序,長度到不長,但真是難以讀懂,後來扣持了一下午終於搞明白了,貼個總結上來。list sort的 如下 ...
STL中的sort函式
b站二面時,面試官問了乙個問題,沒打出來感覺挺虧的。問題是 stl中的sort函式用的什麼排序演算法?這個問題我之前看面經的時候,看了一眼,但是當時沒有仔細研究過。大致知道裡面用了快速排序。stl的sort 演算法,資料量大時採用quick sort,分段遞迴排序。一旦分段後的資料量小於某個閾值,為...