stl的sort演算法:
當區間長度小於閾值(通常為5~20,stl取16)時,直接採用插入排序,因為插入排序的常係數比較小,資料量小時有不錯的效果。
當區間長度大於閾值時,採用內省排序(introsort),其行為在大部分情況下幾乎與三數取中quick sort完全相同。直到下面兩種情況停止:
當遞迴深度過深(遞迴深度》2*log2(len) ),意味著分割行為有惡化為二次行為的傾向時,能夠自我偵測,轉而改用heap sort,使效率維持在o(nlogn)。
當區間長度小於閾值時,停止排序退出introsort呼叫,等待sort函式最後對大體已經有序的陣列整體使用輸入敏感的插入排序。
預設《版本,刪去使用cmp過載部分原始碼:
//三數取中
template
<
class
t>
inline
const t&
__median
(const t& a,
const t& b,
const t& c)
//partition函式
template
<
class
randomaccessiterator
,class
t>
randomaccessiterator __unguarded_partition
(randomaccessiterator first,
randomaccessiterator last,
t pivot)
}const
int __stl_threshold =16;
//閾值設為16
//插入排序部分
template
<
class
randomaccessiterator
,class
t>
void
__unguarded_linear_insert
(randomaccessiterator last, t value)
*last = value;
}template
<
class
randomaccessiterator
,class
t>
inline
void
__linear_insert
(randomaccessiterator first,
randomaccessiterator last, t*
)else
__unguarded_linear_insert
(last, value);}
template
<
class
randomaccessiterator
>
void
__insertion_sort
(randomaccessiterator first, randomaccessiterator last)
template
<
class
randomaccessiterator
,class
t>
void
__unguarded_insertion_sort_aux
(randomaccessiterator first,
randomaccessiterator last, t*
)template
<
class
randomaccessiterator
>
inline
void
__unguarded_insertion_sort
(randomaccessiterator first,
randomaccessiterator last)
template
<
class
randomaccessiterator
>
void
__final_insertion_sort
(randomaccessiterator first,
randomaccessiterator last)
else
__insertion_sort
(first, last);}
//遞迴深度限制選取
template
<
class
size
>
inline size __lg
(size n)
//introsort
template
<
class
randomaccessiterator
,classt,
class
size
>
void
__introsort_loop
(randomaccessiterator first,
randomaccessiterator last, t*
, size depth_limit)
--depth_limit;
//遞迴深度
randomaccessiterator cut = __unguarded_partition
(first, last,t(
__median
(*first,
*(first +
(last - first)/2
),*(last -1)
)));
__introsort_loop
(cut, last,
value_type
(first)
, depth_limit)
; last = cut;}}
//sort函式
template
<
class
randomaccessiterator
>
inline
void
sort
(randomaccessiterator first, randomaccessiterator last)
}
參考:
《stl原始碼剖析》
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...
思科VPP原始碼分析(dpo機制原始碼分析)
vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...
redux原始碼分析(三) 原始碼部分
下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...