//1. 交换算法 swap
template<typename T> void f_swap(T* p_a, T* p_b)
{
T t;
t = *p_a;
*p_a = *p_b;
*p_b = t;
}
//2. 查找算法 find
template<typename T>T * f_find(T* p_begin, T* p_end, T t_value)
{
while(p_begin != p_end&& *p_begin != t_value)
++p_begin;
return p_begin;
}
//3. 复制: 将p_end指向的内容复制到 p_begin的空间
template<typename T> bool f_copy(T* p_begin, T* p_end, size_t n)
{
//if(p_begin>p_end)
// return false;
//or assert(p_begin < p_end)
for(int i=0; i<n; i++)
*p_begin = *p_end;
return true;
}
//4. 累加 accumulate
template<typename T> T f_accumulate(T* p_begin, T* p_end, T t_value )
{
for(;p_begin!=p_end;++p_begin)
t_value = t_value+*p_begin;
return t_value;
}
//* 一定提供一个初值value这样,即使p_begin和p_end之间为空,任能够获得一个确定的值。
//5. 快速排序
template<typename T > T* f_partion(T* p_begin, T* p_end)
{
T* p_free = p_begin ;
T* p_step = p_begin;
for( ; p_free!=p_end+1; p_free++ )
{
if(*p_begin>*p_free)
f_swap(p_step++, p_free);
}
if(*p_begin>*p_step)
swap(p_begin,p_step);
return p_step;
}
template<typename T > void f_quicksort(T* p_begin, T* p_end)
{
T* p_pivot;
if(p_begin<p_end)
{
p_pivot = f_partion(p_begin, p_end);
f_quicksort(p_begin, p_pivot-1);
f_quicksort(p_pivot+1, p_end);
}
}
//6.计算差值
/*这是我自己的一个算法,侯捷先生的STL源码更先进*/
template<typename T> void f_adjacent_difference(T* begin, T* end)
{
T tmp_1, tmp_2;
T* ptr = begin;
tmp_1 = *begin;
while(ptr!=end)
{
ptr++;
tmp_2 = *ptr;
*ptr = *ptr - tmp_1;
tmp_1 = tmp_2;
}
}
//7.binary_search
/*辅助函数 T* get_mid(T* begin , T* end) //获得begin 和 end 指针中间的指针
*/
template<typename T> T* f_binary_search<T* begin , T* end, T val>
{
if(begin!=end) return NULL;
T* p=get_mid(begin, end);
if(val==*p)
return p;//指向查找到的元素
else if (val>*p)
return f_binary_search(p+1, end, val);
else if (val<*p)
return f_binary_search(begin, p-1, val);
}