数据结构-排序-直接插入排序

                直接插入排序

  直接插入排序
  直接插入排序类似对扑克牌的整理,初始情况下把前面第一个看作有序序列,然后后面全是无序。

  这个排序写过很多遍,但是每次回顾都感觉到设计者精彩巧妙的安排。

#include<iostream>
#include<vector>
using namespace std;
//首先定义测试数组  这里对下标0处定义了一个哨兵, 然后从后往前遍历
//哨兵是为了从后往前遍历时候可以减少一次判断下标问题
int test[]={0,5,44,66,11,12,45,98,58,82};
//用数组初始化vector
vector<int> test_v(begin(test),end(test));

//打印数组
inline void printv(const vector<int>& v)
{
      for(auto a:v)  
          cout<<a<<" ";
      cout<<endl;
}

//直接插入排序
void insert_sort(vector<int> &v)
{
    cout<<"直接插入排序"<<endl;
    for(int i=2;i<v.size();i++)
    {
          v[0]=v[i];//为哨兵赋值
          int j=0;   
          //这里的J初始化在I前面一个位置
          //开始从正序最后一个与要插入的比较
          //假如要插入比当前正序[j]小则,j--然后把数据往后挪一个位置即可
          for(j=i-1;v[0]<v[j];j--)
          {
                v[j+1]=v[j];/*v[0]已经保存了v[i]内容不怕被覆盖真是巧妙的想法*/
           }
           //最后跳出循环时候,必然v[0]>v[j],我们只要v[j+1]=v[0]即可
           v[j+1]=v[0];
    }
    printv(v);//打印每次结果,便于观察
}         
int main()
{
    insert_sort(test_v);
    return 0;
}

直接插入排序是一种稳定排序;

但是当数据量大的时候,效率会打打降低。

按照特性,最好情况下,每次只要比较一次,移动2次。分别是v[0]的初始化和v[j+1]=v[0];总的比较次数为2(n-1).

所以好情况下时间复杂度为0(n)

最坏情况下,每次要比较正序所有数字+v[0]的哨兵位,第一次是2然后3 4 5。。。。n。毫无疑问这是个平方阶

所以最坏情况是O(n^2);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值