插入排序适用于基本有序的序列,对基本有序的序列进行排序时,插入排序所花的时间将大大低于冒泡排序与选择排序。
基本思想: 首先将序列分成三部分。
第一部分: 待对比有序的子列。
第二部分: 待插入的值。
第三部分: 未进行处理的无序序列。如下图所示:
上面是执行插入排序下面图中第二个箭头步骤时的情况
待插入的值从未进行处理的无序序列头部取出,最后插入待对比有序的子列,插入位置是比待插入的值小的索引再加上1(前面)。
以下是实现代码(C++):
template<typename T>
void insertionSort(vector<T> &vec)
{
T insertValue;//要插入的数
for(int i = 1; i<vec.size(); i++)
{
insertValue = vec[i];
for(int j = i-1; j>=0; j--)
{
if(insertValue>vec[j])
{
vec[j+1] = insertValue;
break;
}
else
{
vec[j+1] = vec[j];
}
//当待插入数比前面序列所有值都小时
if(j==0)
{
vec[j] = insertValue;
break;
}
}
}
}
为了进行测试,简略的写了个生成基本有序容器的函数,就是在有序容器中间插入一个随机数
//生成整型略有序容器
vector<int> getOrderVector(int vecSize,int left, int right)
{
if(vecSize < 0 || left > right)
{
return vector<int>();
}
vector<int> retVec;
srand((unsigned) time(NULL));
int space = vecSize/(right-left);
for(int i =0; i<vecSize; i++)
{
if(i == vecSize/2)
{
retVec.push_back(left+rand()%(right-left-1));
continue;
}
retVec.push_back(i%space==0?++left:left);
}
return retVec;
}
对大小100000的基本有序容器插入排序进行测试
以下是冒泡排序所花的时间
对比起来时间相差很多。