近來在學習<
這算是自娛自樂吧
這裡只考慮排序的物件的有move建構函式,move賦值函式。
[cpp]view plain
copy
#ifndef yyrsort_h_
#define yyrsort_h_
#include
using
namespace
std;
const
size_t
threshold = 16;
namespace
yyrsort
; auto index = first + 1;
decltype(index) nextpos;
decltype(index) prepos;
auto tempvalue = *index;
for(;index != last; ++index)
else
else
} } }
} //生成最大堆
template
<
typename
randomiterator>
inline
void
make_heap(randomiterator first, randomiterator last)
auto tempvalue = *first;
for(auto pos = first + 1; pos != last; ++pos)
index = (index - 1) / 2;
} else
} } }
//堆排序
template
<
typename
randomiterator>
inline
void
sort_heap(randomiterator first, randomiterator last)
make_heap(first, last);
--last;
auto tempvalue = *first;
for(; first
auto rightchild = leftchild + 1;
if(!(rightchild
else
} else
else
} else
else
} } }
} }
//取三個值的中值
template
<
typename
t>
inline
t& medianthree(t& a, t& b, t& c)
else
if(b
else
} else
else
if(a
else
} } //分割區間為2個子區間,左邊區間所有元素都小於右邊區間的任意乙個原始,返回左邊區間的開始位置
template
<
typename
randomiterator,
typename
t>
inline
randomiterator partition(randomiterator first, randomiterator last, t midvalue)
--last;
while
(midvalue
if(!(first
tempvalue = std::move(*first);
*first = std::move(*last);
*last = std::move(tempvalue);
++first;
} }
//快速排序
template
<
typename
randomiterator>
void
quicksort(randomiterator first, randomiterator last)
; auto divpos = partition(first, last,
medianthree(*first, *(last-1), *(first + (last-first)/2)));
quicksort(first, divpos);
quicksort(divpos, last);
} inline
size_t
_lg(
size_t
s)
return
ret;
} template
<
typename
randomiterator>
void
_introsort(randomiterator first, randomiterator last,
size_t
layerlimit)
else
} } template
<
typename
randomiterator>
inline
void
_insertionsort_unguard(randomiterator first, randomiterator last)
else
} } }
template
<
typename
randomiterator>
inline
void
_insertionsort(randomiterator first, randomiterator last)
else
} //混合排序
template
<
typename
randomiterator>
void
sort(randomiterator first, randomiterator last)
size_t
layerlimit = _lg(last - first) * 2;
_introsort(first, last, layerlimit);
_insertionsort(first, last);
} }
#endif
C 11執行緒池的實現
執行緒池是指定執行緒建立的個數,每個執行緒只是建立銷毀一次。比起毫無限制的建立執行緒銷毀執行緒效率更高。畢竟頻繁的建立銷毀執行緒會消耗系統資源,而且系統建立執行緒也是有上限的。class thread pool thread pool thread pool int n done false els...
c 11自旋鎖的實現
首先我們需要明確,自旋鎖式一種用於保護多執行緒共享資源的鎖,它在linux 核心中也有所使用.epoll 中有使用 和一般互斥鎖不同的式當自旋鎖嘗試獲取cpu的時候可以是一種忙等的狀態,自旋鎖不能主動放棄cpu 如果是核心中的自旋鎖,如果沒有及時釋放一種拿到手中,可能會導致系統掛起 我們在這裡使用c...
C 11讀寫鎖的實現
參考的原始碼 讀寫鎖,一直都有聽,也大概知道點原理,一直沒有 內部是如何實現的,正好今天完成了幾項大作業,研究一下讀寫鎖實現的原理。讀寫鎖的原理就是,可以多次讀,但是寫只能一次一次的寫入,我參考的原始碼博主控制了寫優先,並且讀的優先順序沒我寫的這麼高。我自己在修改了他的原始碼,實現的是讀優先,並且優...