zoukankan      html  css  js  c++  java
  • 直接插入排序算法

    直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

    1.简单方法
         首先在当前有序区R[1..i-1]中查找R[i]的正确插入位置k(1≤k≤i-1);然后将R[k..i-1]中的记录均后移一个位置,腾出k位置上的空间插入R[i]。
      注意:
         若R[i]的关键字大于等于R[1..i-1]中所有记录的关键字,则R[i]就是插入原位置。

    2.改进的方法
      一种查找比较操作和记录移动操作交替地进行的方法。
    具体做法:
         将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i-1,i-2,…,1)的关键字进行比较:
         ① 若R[j]的关键字大于R[i]的关键字,则将R[j]后移一个位置;
          ②若R[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j+1即为R[i]的插入位置。
         关键字比R[i]的关键字大的记录均已后移,所以j+1的位置已经腾空,只要将R[i]直接插入此位置即可完成一趟直接插入排序。

     1 void InsertSort(SeqList R)
     2 {
     3     int i,j;
     4     for(i=2;i<=n;i++)//R[1]默认有序,因此从R[2]开始。
     5     {
     6         if(R[i].key<R[i-1].key)
     7         {
     8             R[0]=R[i];//复制为哨兵(R[0]当哨兵,详解看2.哨兵的作用)
     9             for(j=i-1;R[0].key<R[j].key;--j)//寻找待差位置
    10                 R[j+1]=R[j];//向后挪位
    11         }
    12     }
    13     R[j]=R[0];//想该位置插入合适位置
    14 }

    2.哨兵的作用
         算法中引进的附加记录R[0]称监视哨或哨兵(Sentinel)。
         哨兵有两个作用:
      ① 进人查找(插入位置)循环之前,它保存了R[i]的副本,使不致于因记录后移而丢失R[i]的内容;
      ② 它的主要作用是:在查找循环中"监视"下标变量j是否越界。一旦越界(即j=0),因为R[0].key和自己比较,循环判定条件不成立使得查找循环结束,从而避免了在该循环内的每一次均要检测j是否越界(即省略了循环判定条件"j>=1")。
      注意:
       ① 实际上,一切为简化边界条件而引入的附加结点(元素)均可称为哨兵。
        【例】单链表中的头结点实际上是一个哨兵
      ② 引入哨兵后使得测试查找循环条件的时间大约减少了一半,所以对于记录数较大的文件节约的时间就相当可观。对于类似于排序这样使用频率非常高的算法,要尽可能地减少其运行时间。所以不能把上述算法中的哨兵视为雕虫小技,而应该深刻理解并掌握这种技巧。

    算法分析

    1.算法的时间性能分析 

         对于具有n个记录的文件,要进行n-1趟排序。
        各种状态下的时间复杂度:
       
    注意:
         初始文件按关键字递增有序,简称"正序"。
         初始文件按关键字递减有序,简称"反序"。 

    2.算法的空间复杂度分析
         算法所需的辅助空间是一个监视哨,辅助空间复杂度S(n)=O(1)。是一个就地排序。

    3.直接插入排序的稳定性
         直接插入排序是稳定的排序方法。

    参考:http://student.zjzk.cn/

  • 相关阅读:
    88. Merge Sorted Array
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    83. Remove Duplicates from Sorted List
    82. Remove Duplicates from Sorted List II
    81. Search in Rotated Sorted Array II
    80. Remove Duplicates from Sorted Array II
    计算几何——点线关系(叉积)poj2318
  • 原文地址:https://www.cnblogs.com/houjun/p/4867436.html
Copyright © 2011-2022 走看看