基础算法笔记三 插入排序

插入排序适用于基本有序的序列,对基本有序的序列进行排序时,插入排序所花的时间将大大低于冒泡排序选择排序
基本思想: 首先将序列分成三部分。
第一部分: 待对比有序的子列。
第二部分: 待插入的值。
第三部分: 未进行处理的无序序列。如下图所示:
在这里插入图片描述
上面是执行插入排序下面图中第二个箭头步骤时的情况
在这里插入图片描述
待插入的值从未进行处理的无序序列头部取出,最后插入待对比有序的子列,插入位置是比待插入的值小的索引再加上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的基本有序容器插入排序进行测试
在这里插入图片描述
以下是冒泡排序所花的时间
在这里插入图片描述
对比起来时间相差很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值