高效的插入排序

来源:互联网 发布:免费网络推广平台 编辑:程序博客网 时间:2024/05/16 14:08
#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;
}