排序演算法 C 11的實現

2021-06-22 18:06:04 字數 3332 閱讀 3224

近來在學習<

這算是自娛自樂吧

這裡只考慮排序的物件的有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讀寫鎖的實現

參考的原始碼 讀寫鎖,一直都有聽,也大概知道點原理,一直沒有 內部是如何實現的,正好今天完成了幾項大作業,研究一下讀寫鎖實現的原理。讀寫鎖的原理就是,可以多次讀,但是寫只能一次一次的寫入,我參考的原始碼博主控制了寫優先,並且讀的優先順序沒我寫的這麼高。我自己在修改了他的原始碼,實現的是讀優先,並且優...