⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 algorithm

📁 mpeg4 video codec mpeg4 video codec
💻
📖 第 1 页 / 共 4 页
字号:
    }    else if (pivot < b)    {     iter_swap(pivot, b);     pivot = b;    }    else    {     ++b;    }    if (b == e)     {     assert(comp(*pivot , *b));     if (pivot < b)      {      iter_swap(pivot, --b);      return make_pair(b, e);     }     assert(pivot > e);     iter_swap(pivot, b);     return make_pair(b, b + 1);    }   }  }  static inline unsigned short rand2(void)  {   static unsigned int a = 18000;      static unsigned int g_PrivateRandom2AlgoSeed = 521288629;   return (unsigned short)(g_PrivateRandom2AlgoSeed =     a * (g_PrivateRandom2AlgoSeed & 65535) +     (g_PrivateRandom2AlgoSeed >> 16));  }  template <class Iter,class Compare> Iter SelectPivot(Iter b, Iter e,Compare comp)  {   assert(b < e);   typedef typename iterator_traits<Iter>::difference_type difference_type;    const size_t size = size_t(e - b);   assert(size >= 3);   const size_t innerSize = size - 2;   const size_t offset = (rand2() * innerSize) >> 16u;   assert(offset < innerSize);   const Iter m = b + offset + 1;   assert(b < m && m < e);   // Sort in-place b, m, and e   --e;   if (comp(*m , *b))   {    if (comp(*e , *m))    {     // *e < *m < *b     iter_swap(b, e);    }    else    {     if (comp(*e , *b))     {      // *m <= *e < *b      iter_swap(b, m);      iter_swap(m, e);     }     else     {      // *m < *b <= *e      iter_swap(b, m);     }    }   }   else   {    if (comp(*e , *b))    {     // *e < *b <= *m     iter_swap(b, e);     iter_swap(m, e);    }    else    {     if (comp(*e , *m))     {      // *b <= *e < *m      iter_swap(m, e);     }     else     {      // *b <= *m <= *e      // nothing to do     }    }   }   assert(!(comp(*m , *b)));   assert(!(comp(*e , *m)));   return m;  } } template <class Iter, class Compare> void unstable_sort(Iter b, Iter e,Compare comp) {  assert(e >= b);  // The second branch of Quicksort's recursion is implemented through   //      iteration, hence the following loop  size_t length;   while ((length = static_cast<size_t>(e - b)) > 1)  {   enum { threshold = 8 };   if (length <= threshold)   {    //InsertionSorter<Iter, threshold, 1>::Run(b, length);    SortPrivate::SelectionSorter<Iter, threshold,Compare>::Run(b, length, comp);    return;   }   const pair<Iter, Iter> midRange = SortPrivate::Partition(b, e, SortPrivate::SelectPivot(b, e, comp), comp);   assert(midRange.second - midRange.first > 0);   assert(b <= midRange.first);   assert(midRange.second <= e);   if (midRange.first - b < e - midRange.second)   {    unstable_sort(b, midRange.first,comp);    b = midRange.second;   }   else   {    unstable_sort(midRange.second, e,comp);    e = midRange.first;   }  }	}	template<class RandomAccessIterator> void stable_sort(RandomAccessIterator first, RandomAccessIterator last){		less<typename iterator_traits<RandomAccessIterator>::value_type> c;		stable_sort(first, last, c);	}	template<class RandomAccessIterator,class Compare> _UCXXEXPORT		void stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp)	{		//FIXME - bubble sort		RandomAccessIterator temp;		--last;		while(last - first > 0){			temp = last;			while(temp != first){				if( comp( *temp, *(temp-1) ) ){					iter_swap( temp-1, temp);				}				--temp;			}			++first;		}	}	template<class RandomAccessIterator> _UCXXEXPORT		void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last)	{		less<typename iterator_traits<RandomAccessIterator>::value_type> c;		partial_sort(first, middle, last, c);	}	template<class RandomAccessIterator, class Compare> _UCXXEXPORT		void partial_sort(RandomAccessIterator first, RandomAccessIterator middle,			RandomAccessIterator last, Compare comp)	{		//Fixme - partial bubble sort		RandomAccessIterator temp;		--last;		while(first < middle){			temp = last;			while(temp != first){				if( comp(*temp, *(temp -1 ) ) ) {					iter_swap( temp-1, temp);				}				--temp;			}			++first;		}	}	template<class InputIterator, class RandomAccessIterator> _UCXXEXPORT		RandomAccessIterator		partial_sort_copy(InputIterator first, InputIterator last,			RandomAccessIterator result_first, RandomAccessIterator result_last)	{		less<typename iterator_traits<RandomAccessIterator>::value_type> c;		return partial_sort_copy(first, last, result_first, result_last, c);	}	template<class InputIterator, class RandomAccessIterator, class Compare> _UCXXEXPORT		RandomAccessIterator		partial_sort_copy(InputIterator first, InputIterator last,			RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp)	{		size_t output_size = last-first;		size_t temp_size = result_last - result_first;		if(temp_size < output_size){			output_size = temp_size;		}		RandomAccessIterator middle = result_first + output_size;		RandomAccessIterator temp = result_first;		while(temp != middle){			*temp = *first;			++temp;			++first;		}		sort(result_first, middle, comp);		while( first != last){			if( comp( *first, *(middle-1) ) ){				*(middle-1) = *first;				sort(result_first, middle, comp);			}			++first;		}		return middle;	}	template<class RandomAccessIterator> _UCXXEXPORT		void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last)	{		less<typename iterator_traits<RandomAccessIterator>::value_type> c;		nth_element(first, nth, last, c);	}	template<class RandomAccessIterator, class Compare> _UCXXEXPORT		void nth_element(RandomAccessIterator first, RandomAccessIterator nth,			RandomAccessIterator last, Compare comp)	{		partial_sort(first, nth, last, comp);	}	template<class ForwardIterator, class T> _UCXXEXPORT		ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,			const T& value)	{		less<typename iterator_traits<ForwardIterator>::value_type> c;		return lower_bound(first, last, value, c);	}	template<class ForwardIterator, class T, class Compare> _UCXXEXPORT		ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,			const T& value, Compare comp)	{		if(first == last){			return last;		}		//If below or equal to the first element		if( comp(*first, value) == false){			return first;		}		ForwardIterator middle;		//If greater than the top element		middle = first;		advance(middle, distance(first, last) - 1);		if( comp(*middle, value) ){			return last;		}		//Now begin the actual search for the begining		while( distance(first, last) > 1 ){			//Find middle			middle = first;			advance(middle, (distance(first, last)/2) );			if( !comp(*middle, value) ){				last = middle;			}else{				first = middle;			}		}			if( !comp(*first, value) ){			return first;		}		return last;	}	template<class ForwardIterator, class T> _UCXXEXPORT		ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,			const T& value)	{		less<typename iterator_traits<ForwardIterator>::value_type> c;		return upper_bound(first, last, value, c);	}	template<class ForwardIterator, class T, class Compare> _UCXXEXPORT		ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,			const T& value, Compare comp)	{		if(first == last){			return last;		}		//If below the first element		if( comp(value, *first) == true){			return first;		}		ForwardIterator middle;		//If greater than the top element		middle = first;		advance(middle, distance(first, last) - 1);		if( comp(*middle, value) ){			return last;		}		//Now begin the actual search for the end		while( distance(first, last) > 1 ){			//Find middle			middle = first;			advance(middle, (distance(first, last)/2) );			if( comp(value, *middle) ){				last = middle;			}else{				first = middle;			}		}			if( comp(value, *first) ){			return first;		}		return last;	}	template<class ForwardIterator, class T> _UCXXEXPORT		pair<ForwardIterator, ForwardIterator>		equal_range(ForwardIterator first, ForwardIterator last, const T& value)	{		less<typename iterator_traits<ForwardIterator>::value_type> c;		return equal_range(first, last, value, c);	}	template<class ForwardIterator, class T, class Compare> _UCXXEXPORT		pair<ForwardIterator, ForwardIterator>		equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp)	{		pair<ForwardIterator, ForwardIterator> retval;		retval.first = lower_bound(first, last, value, comp);		//Reuse retval.first in order to (possibly) save a few comparisons		retval.second = upper_bound(retval.first, last, value, comp);		return retval;	}	template<class ForwardIterator, class T> _UCXXEXPORT		bool binary_search(ForwardIterator first, ForwardIterator last,			const T& value)	{		less<typename iterator_traits<ForwardIterator>::value_type> c;		return binary_search(first, last, value, c);	}	template<class ForwardIterator, class T, class Compare> _UCXXEXPORT		bool binary_search(ForwardIterator first, ForwardIterator last,			const T& value, Compare comp)	{		if( distance(first, last) == 0){			return false;		}		ForwardIterator middle;		while( distance(first, last) > 1 ){			//Set middle between first and last			middle = first;			advance(middle, distance(first, last)/2 );			if( comp(*middle, value ) == true){				first = middle;			}else{				last = middle;			}		}		if( !comp(*first, value) && !comp(value, *first) ){			return true;		}			if( !comp(*last, value) && !comp(value, *last) ){			return true;		}			return false;	}	// _lib.alg.merge_, merge:	template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT		OutputIterator		merge(InputIterator1 first1, InputIterator1 last1,			InputIterator2 first2, InputIterator2 last2, OutputIterator result)	{		less<typename iterator_traits<InputIterator1>::value_type> c;		return merge(first1, last1, first2, last2, result, c);	}	template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT		OutputIterator		merge(InputIterator1 first1, InputIterator1 last1,			InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)	{		while( first1 != last1 && first2 != last2){			//If in this order so first1 elements which are equal come first			if( comp(*first2, *first1) ){				*result = *first2;				++first2;			}else{				*result = *first1;				++first1;			}			++result;		}		//Clean up remaining elements		while(first1 != last1){			*result = *first1;			++first1;			++result;		}		while(first2 != last2){			*result = *first2;			++first2;			++result;		}		return result;	}	template<class BidirectionalIterator> _UCXXEXPORT		void inplace_merge(BidirectionalIterator first,			BidirectionalIterator middle, BidirectionalIterator last)	{		less<typename iterator_traits<BidirectionalIterator>::value_type> c;		inplace_merge(first, middle, last, c);	}	template<class BidirectionalIterator, class Compare> _UCXXEXPORT		void inplace_merge(BidirectionalIterator first,			BidirectionalIterator middle, BidirectionalIterator last, Compare comp)	{		//FIXME - using a bubble exchange method		while(first != middle && middle !=last){			if( comp(*middle, *first) ){				BidirectionalIterator temp(middle);				while( temp != first){					iter_swap(temp, temp-1);					--temp;				}				++middle;			}			++first;		}	}	// _lib.alg.set.operations_, set operations:	template<class InputIterator1, class InputIterator2> _UCXXEXPORT		bool includes(InputIterator1 first1, InputIterator1 last1,			InputIterator2 first2, InputIterator2 last2)	{		less<typename iterator_traits<InputIterator1>::value_type> c;		return includes(first1, last1, first2, last2, c );	}	template<class InputIterator1, class InputIterator2, class Compare> _UCXXEXPORT		bool includes(InputIterator1 first1, InputIterator1 last1,			InputIterator2 first2, InputIterator2 last2, Compare comp)	{		while(first2 != last2){			//Advance the large set until no longer smaller than the element we are looking for			while( comp(*first1, *first2) ){				++first1;				//If we are at the end of the list, we don't have the desired element				if(first1 == last1){					return false;				}			}			//If we are past the element we want, it isn't here			if( comp(*first2, *first1) ){				return false;			}			++first2;	//Move to next element		}		return true;	}	template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT		OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,			InputIterator2 first2, InputIterator2 last2, OutputIterator result)	{		less<typename iterator_traits<InputIterator1>::value_type> c;		return set_union(first1, last1, first2, last2, result, c);	}	template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT		OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,			InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)	{		while( first1 != last1 && first2 != last2){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -