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;
    }
  • 相关阅读:
    C++中使用多线程
    hdu 4223 dp 求连续子序列的和的绝对值最小值
    hdu 1372 bfs 计算起点到终点的距离
    hdu 4217 线段树 依次取第几个最小值,求其sum
    心得
    hdu 1175 bfs 按要求进行搜索,是否能到达,抵消两个(相同)棋子
    hdu 4221 greed 注意范围 工作延期,使整个工作时间罚时最少的单个罚时最长的值
    hdu 2844 多重背包 多种硬币,每一种硬币有一点数量,看他能组成多少种钱
    uva LCDDisplay
    hdu 4218 模拟 根据一个圆点和半径画一个圆 注意半径要求
  • 原文地址:https://www.cnblogs.com/Nice-Boy/p/6075901.html
Copyright © 2011-2022 走看看