C STL sort原始碼分析

2021-10-09 04:10:16 字數 3169 閱讀 4493

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,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...