#include <algorithm>
using namespace std;
template<class RandomAccessIterator,class T>//插入排序的辅助函数1
inline void InnerInsert(RandomAccessIterator first,RandomAccessIterator last,T *);
template<class RandomAccessIterator,class T>//插入排序的辅助函数2
inline void UnguardedInnerInsert(RandomAccessIterator last,T value);
template<class RandomAccessIterator>
void InsertSort(RandomAccessIterator first,RandomAccessIterator last)
{
if(first == last)
return;
for(RandomAccessIterator iter = first + 1;iter != last;++iter)//外层循环
{
InnerInsert(first,iter);//内层循环
}
}
template<class RandomAccessIterator>
inline void InnerInsert(RandomAccessIterator first,RandomAccessIterator last)
{
typedef typename iterator_traits<RandomAccessIterator>::value_type ValueType;
ValueType value = *last;
if(value < *first) //小于最前端的数,则整体后移
{
copy_backward(first,last,last+1);
*first = value;
}
else
{
UnguardedInnerInsert(last,value);
}
}
template<class RandomAccessIterator,class T>
inline void UnguardedInnerInsert(RandomAccessIterator last,T value)
{
RandomAccessIterator next = last;
--next;
while(value < *next)
{
*last = *next;
last = next;
--next;
}
*last = value;
}
using namespace std;
template<class RandomAccessIterator,class T>//插入排序的辅助函数1
inline void InnerInsert(RandomAccessIterator first,RandomAccessIterator last,T *);
template<class RandomAccessIterator,class T>//插入排序的辅助函数2
inline void UnguardedInnerInsert(RandomAccessIterator last,T value);
template<class RandomAccessIterator>
void InsertSort(RandomAccessIterator first,RandomAccessIterator last)
{
if(first == last)
return;
for(RandomAccessIterator iter = first + 1;iter != last;++iter)//外层循环
{
InnerInsert(first,iter);//内层循环
}
}
template<class RandomAccessIterator>
inline void InnerInsert(RandomAccessIterator first,RandomAccessIterator last)
{
typedef typename iterator_traits<RandomAccessIterator>::value_type ValueType;
ValueType value = *last;
if(value < *first) //小于最前端的数,则整体后移
{
copy_backward(first,last,last+1);
*first = value;
}
else
{
UnguardedInnerInsert(last,value);
}
}
template<class RandomAccessIterator,class T>
inline void UnguardedInnerInsert(RandomAccessIterator last,T value)
{
RandomAccessIterator next = last;
--next;
while(value < *next)
{
*last = *next;
last = next;
--next;
}
*last = value;
}