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

    算法思想:每一趟将一个待排序的记录,按照其关键字的大小插入到有序队列的合适位置里,知道全部插入完成。 

    设计步骤

      假设有一组无序序列 R0, R1, ... , RN-1。

      (1) 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列。

      (2) 然后,我们要依次把 R1, R2, ... , RN-1 插入到这个有序序列中。所以,我们需要一个外部循环,从下标 1 扫描到 N-1 。

      (3) 接下来描述插入过程。假设这是要将 Ri 插入到前面有序的序列中。由前面所述,我们可知,插入Ri时,前 i-1 个数肯定已经是有序了。

      所以我们需要将Ri 和R0 ~ Ri-1 进行比较,确定要插入的合适位置。这就需要一个内部循环,我们一般是从后往前比较,即从下标 i-1 开始向 0 进行扫描。 

    代码实现

    def get_number(num):
        import random
        lst = []
        i = 0
        while i < num:
            lst.append(random.randint(0,100))
            i += 1
        return lst
    
    def insertsort(lst):
        if lst:
            if len(lst) == 1:
                return lst
            else:
                for i in range(1,len(lst)):
                    tmp = lst[i]
                    for j in range(i):
                        if lst[j] > lst[i]:
                            for k in range(i,j,-1):
                                lst[k] = lst[k-1]
                            lst[j] = tmp
                return lst
        return None
    a = get_number(10)
    print("排序之前:",a)
    b = insertsort(a)
    print("排序之后:",b)
    
    #######输出结果##########
    排序之前: [53, 20, 64, 11, 72, 89, 34, 60, 36, 25]
    排序之后: [11, 20, 25, 34, 36, 53, 60, 64, 72, 89]

    性能分析

    时间复杂度 

      当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)。 

      当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N2)

      所以,数据越接近正序,直接插入排序的算法性能越好。 

    空间复杂度由直接插入排序算法可知,我们在排序过程中,需要一个临时变量存储要插入的值,所以空间复杂度为 1 。

    算法稳定性直接插入排序的过程中,不需要改变相等数值元素的位置,所以它是稳定的算法。 

  • 相关阅读:
    FEniCS 1.1.0 发布,计算算术模型
    Piwik 1.10 发布,增加社交网站统计
    淘宝褚霸谈做技术的心态
    CyanogenMod 10.1 M1 发布
    Druid 发布 0.2.11 版本,数据库连接池
    GNU Gatekeeper 3.2 发布
    Phalcon 0.9.0 BETA版本发布,新增大量功能
    EUGene 2.6.1 发布,UML 模型操作工具
    CVSps 3.10 发布,CVS 资料库更改收集
    Opera 移动版将采用 WebKit 引擎
  • 原文地址:https://www.cnblogs.com/vipchenwei/p/7106503.html
Copyright © 2011-2022 走看看