zoukankan      html  css  js  c++  java
  • 插入排序

    1、插入排序的核心算法

        将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数。

        即:序列的第一个元素,肯定是有序的,把第二个元素和第一个元素相比,插入到合适的位置,这样前两个元素就有序了,接着,把第三个元素插入到前面包含两个元素的有序列表中,以此类推,直至插完第n个数据。

    2、Python代码

    两种实现:

    def insertSort(listx):
        for i in xrange(1,len(listx)):
            for j in xrange(i-1,-1,-1):
                if listx[j+1]<listx[j]:
                    listx[j],listx[j+1]=listx[j+1],listx[j]
               else:
                    break
        return listx
     
    def insertSort(listx):
        xLen = len(listx)
        for i in xrange(1,xLen):
              j = i -1
              while j >= 0:
               if listx[j] > listx[j+1]:
                    listx[j+1],listx[j] = listx[j],listx[j+1]
                    j -= 1
               else:
                    break
        return listx
    3、时间复杂度:O(n^2)
    时间复杂度的计算:(平均情况=(最好情况+最差情况)/2)

    在计算时间复杂度时,我们一般使用的大O表示法,其时间复杂度,从小到大的排序是:

    O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<...<O(2^n)<O(n!)

    在最好的情况下,即序列已经是排好序的情况下,每次比较一次就退出while循环,则总比较次数是n-1次,时间复杂度是O(n)

    在最坏的情况下,即每次while循环都要比较到第一个元素,则:

    第一次循环,比较了1次;

    第二次循环,比较了2次;

    ...

    n-1次循环,比较了n-1次;

    总的比较次数是1+2+3+...+(n-1) = n(n-1)/2

    我们上面所求得的n(n-1)/2,其时间复杂度,最大的影响因子是n^2/2,故其时间复杂度是O(n^2)

     
     
  • 相关阅读:
    【BZOJ2243】【SDOI2011】染色 (LCT)
    【BZOJ2631】tree (LCT)
    【BZOJ3626】【LNOI2014】LCA (树剖+离线)
    [BZOJ3244][NOI2013] 树的计数
    BZOJ2754 SCOI2012day1T2喵星球上的点名(后缀数组)
    BZOJ2753 SCOI2012day1T1滑雪与时间胶囊(bfs+kruskal)
    Swift
    Library not loaded: @rpath/libswiftCore.dylib
    PHP require include 区别
    Mac OS 下 eclipse中文乱码解决方法
  • 原文地址:https://www.cnblogs.com/emily-qin/p/7058280.html
Copyright © 2011-2022 走看看