zoukankan      html  css  js  c++  java
  • 排序算法之一插入排序

    基本思想

    每次将一个待排序的记录,按其关键字大小,插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。

    分类

    根据寻找插入位置方法分为

    • 直接插入排序
    • 折半(二分)插入排序
    • 希尔插入排序

    直接插入排序

    基本思想

    当插入第i(i1)个对象时,前面的V[0],V[1],,V[i1]已经排好序。这时,用V[i]的排序码与V[i1],V[i2],,V[0]的排序码顺序进行比较,找到插入位置即将V[i]插入,原来位置上的对象向后顺移。

    直接插入排序图示

    这里写图片描述

    从上到下,分别展示了直接排序算法的所有可能的过程,包括相同排序码的排序方式(保持了原来的顺序,说明是稳定排序)以及in-place操作中的元素移动等。

    这里写图片描述

    直接插入排序算法分析

    设待排序对象个数为n,则该算法的主程序执行n1排序码比较次数和对象移动次数与对象排序码的初始排列有关

    • 最好情况下,排序前对象已经按照要求的有序。比较次数(KCN):n1 ; 移动次数(RMN):为0。则对应的时间复杂度为O(n)
    • 最坏情况下,排序前对象为要求的顺序的反序。第i趟时第i个对象必须与前面i个对象都做排序码比较,并且每做1次比较就要做1次数据移动(具体可以从下面给出的代码中看出)。
    • 比较次数(KCN):∑n1i=1i=n(n1)2n22 ; 移动次数(RMN):为n1i=1i=n(n1)2n22。则对应的时间复杂度为O(n2)
    • 如果排序记录是随机的,那么根据概率相同的原则,在平均情况下的排序码比较次数和对象移动次数约为n24,因此,直接插入排序的时间复杂度O(n2)

    直接插入排序算法的特点

    • 它是稳定排序,不改变相同元素原来的顺序。
    • 它是in-place排序,只需要O(1)的额外内存空间。
    • 它是在线排序,可以边接收数据边排序。
    • 它跟我们牌扑克牌的方式相似。
    • 对小数据集是有效的。

    直接插入排序伪代码

    for j=2 to A.length
        key = A[j]
        i = j-1
    
        while i>0 and A[i]>key
            
            A[i+1] =A[i]
            i = i-1
        
        A[i+1] = key

    直接插入排序C代码

      

    for(j=1;j<n;j++)
    {
        key = A[j];
        for(i=j-1;i>=0&&A[i]>key;i--)
            A[i+1] = A[i];
        A[i] = key;
    }
  • 相关阅读:
    基础语法 -实验楼
    JavaSE案例-Bank
    初识Java
    Java学习大纲-0412更新
    增量法
    蛮力法
    Host‘116.77.33.xx’is not allowed to connect to this MySQL server
    Maven坐标
    HotSpot虚拟机对象创建
    程序计数器为什么是线程私有的?
  • 原文地址:https://www.cnblogs.com/Nice-Boy/p/6075901.html
Copyright © 2011-2022 走看看