zoukankan      html  css  js  c++  java
  • 数据结构-排序-直接插入排序

                    直接插入排序

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

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

    #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);

  • 相关阅读:
    laravel 汇总数据
    Sway
    利用 Windows API Code Pack 修改音乐的 ID3 信息
    Windows Server 2012 R2 设置 NTP 服务
    Visual Studio "14" CTPs
    Win8.1 查看 “Windows 体验指数“
    json2csharp & json 格式化
    山寨版 WP8.1 Cortana 启动 PC
    Newtonsoft.Json WindowPhone7.1
    Cisco交换机基础命令 + Win Server08 R2 多网卡配置链路聚合
  • 原文地址:https://www.cnblogs.com/DJC-BLOG/p/9069887.html
Copyright © 2011-2022 走看看