美文网首页
八大排序入门之直接插入排序O(n^2)

八大排序入门之直接插入排序O(n^2)

作者: _____Mori_ | 来源:发表于2018-03-27 16:54 被阅读0次

苦于学了忘,忘了学,部门大佬给机会周会每周一道算法题开阔思维,那我只能从最基础的学起来了。该系列一边学码UML加深印象记住简单的算法逻辑,一边回顾算法。。。反正就随便记随便看吧。有时候会总结一下部门出的题也发上来


UML练习
InsertSort.png
UMLCODE
@startuml
start
:InsertSort.directInsert(int[] before);
note right
    直接插入,输入乱序数组{2,1,8,5,4}
    左小右大算法
end note
while (int i=1;i<before.length?) is (true)
note right
    外层循环,哨兵会从{1->8->5->4}
    一个个跟前面的对比大小(内层循环)
    所以会循环n-1次(4)
end note
   :int k=i-1;
note right
    设置哨兵预备插入的位置
    当前监控值所在位置-1
    作用域问题,不用j
end note
   :int temp=before[i];
   note right
       临时存储
       当前监控值
       (第一次循环 拿1(before[1]))
   end note
  while (int j=k;j>=0&&before[j]>temp) is (true)
  note right
      内层循环,一旦哨兵监控的位置(j)
      下标满足正常的>=0
      且 监控值(位置后)比(监控位置)小
      需要移位 (temp 1|2 2 8 5 4)
      再次对比,不满足条件,那就插入Index
      为0的地方吧。但是已经j--
      k-- 所以在外面监控位置回退
      //其实就是整个循环
      保障所有大于监控值的值往后移动

  end note
    :before[j+1]=before[j];
    :j--;
    :k--;
  endwhile (false)
  :before[k+1]=temp;
  note right
  不满足条件
  (k变成-1或者
  已经不满足before[j])
  监控位置回退

  end note
  :i++;
endwhile (false)
:return before[];

stop
@enduml
直接排序CODE
//默写实现
    public static int[] insertSort2(int [] before){

        for(int i=1;i<before.length;i++){
            int temp=before[i];//哨兵值
            int k=i-1;//哨兵准备插入的前一个位置  预判
            //判断哨兵和前一个位置
            for(int j=k;j>=0&&before[j]>temp;j--){
                before[j+1]=before[j];//哨兵保存着最后的值 相对的后面的值有两个 所以不怕前面的再覆盖 最后再
                k--;//记录哨兵监控位置
            }
            //最后监控的k--的部分不满足before[k]>temp 或者k<0 所以这个时候k+回1
            before[k+1]=temp;
        }

        /**
         *          | 2 1 9 10 5
         *        -----------
         *        1 | 2|2     哨兵1 对比小于2  2 后移
         *      (1 | -1-|2) ->继续判断 k=-1不合理 哨兵归位 k=0 插入哨兵
         *        9 | 1 2|-9-
         *       10 | 1 2 9|-10-   不满足哨兵小于监控处  哨兵归位
         *       5  | 1 2 9 10| 10  满足哨兵小于监控处  哨兵往前,for(满足)哨兵往前   直至
         *     (5  | 1 2 9 9| 10)
         *     (5  | 1 2 -5- 9 |10) -> k=2合理但是不满足哨兵小于监控位置(2) 归位  插入
         *
         *
         */
        return before;
    }

相关文章

  • 排序算法

    冒泡排序:平均时间复杂度O(n^2),最好情况O(n) 稳定排序 直接插入排序 平均时间复杂度O(n^2) ...

  • 排序算法

    内部排序插入排序:最坏时间复杂度O(n^2),最佳时间复杂度O(n),空间复杂度 O(1)直接插入排序希尔排序选择...

  • 排序技术

    排序算法平均时间复杂度最好最差空间复杂度稳定性直接插入排序O(n2)O(n)O(n2)O(1)稳定冒泡排序O(n2...

  • PTA刷题总结-Part3.3 排序专题

    本章节涵盖了冒泡排序O(n^2) 、选择排序O(n^2) 、插入排序O(n^2)、快速排序O(nlogn)和归并排...

  • 排序算法小总结

    排序算法时间复杂度冒泡排序O(n2)选择排序O(n2)插入排序O(n2)希尔排序O(n1.5)快速排序O(N*lo...

  • python 八大算法

    排序算法总结 排序算法 平均时间复杂度 冒泡排序O(n2) 选择排序O(n2) 插入排序O(n2) 希尔排序O(n...

  • 插入排序

    直接插入排序 时间复杂度 : O(n²) , θ(n²) , Ω(n)插入排序由n-1趟排序组成 , 对于p=1 ...

  • 常见算法python实现

    1.冒泡排序,T(n) = O(n**2) 2.选择排序,T(n) = O(n**2) 3.插入排序,T(n) =...

  • 排序算法

    插入排序平均:O(n^2) ,最坏:O(n^2) 归并排序(spark shuffle 排序算法)平均:O(nlo...

  • Java基本算法实现和区别

    算法实现 直接插入排序 时间复杂度:O(n2) 希尔排序 时间复杂度:O(n1.3) 冒泡排序 时间复杂度:O(n...

网友评论

      本文标题:八大排序入门之直接插入排序O(n^2)

      本文链接:https://www.haomeiwen.com/subject/qvsscftx.html