SLT之算法实现

来源:互联网 发布:阳江淘宝贝幼儿园 编辑:程序博客网 时间:2024/05/28 09:32
#ifndef _ALGOBASE_H#define _ALGOBASE_H#include"heap.h"template<class InputIterator,class OutputIterator>inline OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result){return __copy_dispatch<InputIterator, OutputIterator>()(first, last, result);}inline char* copy(const char* first, const char* last, char* result){memmove(result, first, last - first);return result + (last - first);}inline wchar_t* copy(const wchar_t* first, const wchar_t* last, wchar_t* result){memmove(result, first, last - first);return result + (last - first);}template<class InputIterator,class OutputIterator>struct __copy_dispatch{OutputIterator operator()(InputIterator first, InputIterator last, OutputIterator result){return __copy(first, last, result, iterator_category(first));}};template<class T>struct __copy_dispatch<T*, T*>{T* operator()(T* first, T* last, T* result){typedef typename __type_traits<T>::has_trivial_assignment_operator t;return __copy_t(first, last, result, t());}};template<class T>struct __copy_dispatch<const T*, T*>{T* operator()(const T* first, const T* last, T* result){typedef typename __type_traits<T>::has_trivial_assignment_operator t;return __copy_t(first, last, result, t());}};template<class InputIterator,class OutputIterator>inline OutputIterator __copy(InputIterator first, InputIterator last, OutputIterator result, input_iterator_tag_h){for (; first != last; ++first,++result)*result = *first;return result;}template<class InputIterator,class OutputIterator>inline OutputIterator __copy(InputIterator first, InputIterator last, OutputIterator result, random_access_iterator_tag_h){return __copy_d(first, last, result, distance_type(first));}template<class RandomAccessIterator,class OutputIterator,class Distance>inline OutputIterator __copy_d(RandomAccessIterator first, RandomAccessIterator last, OutputIterator result, Distance*){for (Distance n = last - first; n > 0; --n, ++result, ++first)*result = *first;return result;}template<class T>inline T* __copy_t(const T* first, const T* last, T* result, __true_type){memmove(result, first, sizeof(T)*(last - first));return result + (last - first);}template<class T>inline T* __copy_t(const T* first, const T* last, T* result, __false_type){return __copy_d(first, last, result, (ptrdiff_t*)0);}template<class RandomAccessIterator>inline void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last){__partial_sort(first, middle, last, value_type(first));}template<class RandomAccessIterator,class T>void __partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, T*){mymake_heap(first, middle);for (RandomAccessIterator i = middle; i < last; ++i)if (*i < *first)__pop_heap(first, middle, i, T(*i), distance_type(first));mysort_heap(first, middle);}template<class RandomAccessIterator>void __insertion_sort(RandomAccessIterator first, RandomAccessIterator last){if (first == last)return;for (RandomAccessIterator i = first + 1; i != last; ++i)__linear_insert(first, i, value_type(first));}template<class RandomAccessIterator,class T>inline void __linear_insert(RandomAccessIterator first, RandomAccessIterator last, T*){T value = *last;if (value < *first){std::copy_backward(first, last, last + 1);*first = value;}else__unguarded_linear_insert(last, value);}template<class RandomAccessIterator,class T>void __unguarded_linear_insert(RandomAccessIterator last, T value){RandomAccessIterator next = last;--next;while (value < *next){*last = *next;last = next;--next;}*last = value;}template<class T>inline const T& __median(const T& a, const T& b, const T& c){if (a < b)if (b < c)return b;else if (a < c)return c;elsereturn a;else if (a < c)return a;else if (b < c)return c;elsereturn b;}template<class ForwardIterator1,class ForwardIterator2,class T>inline void __iter_swap(ForwardIterator1 a, ForwardIterator2 b, T*){T tmp = *a;*a = *b;*b = tmp;}template<class ForwardIterator1,class ForwardIterator2>inline void iter_swap(ForwardIterator1 a, ForwardIterator2 b){__iter_swap(a, b, value_type(a));}template<class RandomAccessIterator,class T>RandomAccessIterator __unguarded_partition(RandomAccessIterator first, RandomAccessIterator last, T pivot){while (true){while (*first < pivot) ++first;--last;while (*last > pivot) --last;if (!(first < last))return first;iter_swap(first, last);++first;}}template<class RandomAccessIterator>inline void sort(RandomAccessIterator first, RandomAccessIterator last){if (first != last){__introsort_loop(first, last, value_type(first), __lg(last - first) * 2);__final_insertion_sort(first, last);}}template<class Size>inline Size __lg(Size n){Size k;for (k = 0; n > 1; n >>= 1)++k;return k; }const int __stl_threshold = 16;template<class RandomAccessIterator,class T,class Size>void __introsort_loop(RandomAccessIterator first, RandomAccessIterator last, T*, Size depth_limit){while (last - first > __stl_threshold){if (depth_limit == 0){partial_sort(first, last, last);return;}--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;}}template<class RandomAccessIterator>void __final_insertion_sort(RandomAccessIterator first, RandomAccessIterator last){if (last - first > __stl_threshold){__insertion_sort(first, first + __stl_threshold);__unguarded_insertion_sort(first + __stl_threshold, last);}else__insertion_sort(first, last);}template<class RandomAccessIterator>inline void __unguarded_insertion_sort(RandomAccessIterator first, RandomAccessIterator last){__unguarded_insertion_sort_aux(first, last, value_type(first));}template<class RandomAccessIterator,class T>void __unguarded_insertion_sort_aux(RandomAccessIterator first, RandomAccessIterator last, T*){for (RandomAccessIterator i = first; i != last; ++i)__unguarded_linear_insert(i, T(*i));} #endif

0 0
原创粉丝点击