• 直接插入排序


       直接插入排序为稳定排序,基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。时间复杂度为O(n*n),辅助空间为O(1)。
        基本思想:假设在排序过程中,记录序列R[1..n],将记录R[i]插入到有序子序列R[1..i-1]中,使记录的有序序列从R[1..i-1]变为R[1..i]。R[i]的插入过程就是完成排序中的一趟,随着有序序列的不断扩大,最终使全部有序,完成排列。
        算法分析:要将R[i]插入到前面的有序序列中,只要将该记录的关键字与第i-1个记录开始的记录关键字进行比较,当它比前面的数小时,前面的记录顺序后移,否则将该记录存入该单元。在此,还要注意将R[i]临时存储到R[0]中暂存。
     
         哨兵(监视哨)的作用:
    1.作为临时变量存放R[i]的副本。
    2.在查找循环中用来监视下标变量j是否越界。
     
        算法效率:
    时间复杂度最好的情况是已经排好序,比较次数为n-1,移动次数为0;
    最坏的情况是反序时进行插入排序,平均的移动次数和比较次数都是O(n*n)。
    空间复杂度为O(1)。
     
        排序特点:
    1.是一种稳定的排序方法。
    2.适用于接近排好序的情况。
    3.适用于n较小的情况。
    4.直至最后一趟排序过程才能确定一个元素的最终位置。
     
      从空间来看,它只需要一个记录的辅助空间R[0];从时间来看,n个记录要进行n-1趟插入过程,每一趟都要进行与关键字的比较和记录的移动,但是比较的次数是不固定的。最好的情况是记录已经是排列有序的,则每一趟都只需要比较一次,就可以找到插入记录的位置,不需移动记录,复杂度为O(n);最坏情况是记录逆序存放,则每一趟都要与前面的关键字进行比较并移动记录,复杂度为O(n*n)。所以平均性能的复杂度为O(n*n)。
        因此,直接插入排序算法非常适合记录基本有序且记录数不是很多的情形。
     
    无哨兵
    void InsertSortArray() 
    {
        for(int i=1;i<n;i++)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分 
        {
            int temp=arr[i];//temp标记为未排序第一个元素 
            int j=i-1;
            while (j>=0 && arr[j]>temp)/*将temp与已排序元素从大到小比较,寻找temp应插入的位置*/
            { 
                arr[j+1]=arr[j];  
                j--; 
            } 
            arr[j+1]=temp; 
        } 
    } 

    有哨兵

     
  • 相关阅读:
    BZOJ3197:[SDOI2013]刺客信条——题解
    C 程序与 C++ 程序之间的相互调用
    使用Dev C++调试(debug)程序
    ARM 汇编指令 ADR 与 LDR 使用
    华为交换机以 LACP 模式实现链路聚合
    DLCI 简介
    华为路由器帧中继 FR 实验
    GVRP 的工作机制和工作模式
    华为路由器 HDLC 实验
    华为路由器 IPSec 与 GRE 结合实验
  • 原文地址:https://www.cnblogs.com/fickleness/p/3337878.html
Copyright © 2020-2023  润新知