zoukankan      html  css  js  c++  java
  • python插入排序算法总结

    插入排序算法总结:

    插入算法的核心是 每次循环到一个数时,都认为这个数之前的数列都是排好序的,将一个数插入到已经排好序的有序数列中,从而得到一个新的、个数加一的有序数列。

    过程:从第一个元素开始,第一个数肯定是有序的,把第二个数和第一个数相比,插入到合适的位置,这样前两个数就是有序的了,接着,把第三个元素插入到前面包含两个元素的有序列表中,依次类推,知道插完第n个数据。

     

    第一步:拿一个有序数列为基础,后边加一个数,实现插入排序的逻辑

    a=[3,5,8,10,6]

     

    代码

    #encodjng=utf-8

     

    a=[3,5,8,10,6]

    print a

    index=len(a)-1

    for j in range(index-1,-1,-1):

        print "j:",j

        if a[j+1] < a[j]:

            a[j+1],a[j]=a[j],a[j+1]

            print "a[j+1] < a[j]:","%s < %s"%(a[j+1],a[j])

            print " a:",a

        else:

            break

     

    print a

           

    执行过程:

     

    D: est>python test.py

    [3, 5, 8, 10, 6]

    j: 3

    a[j+1] < a[j]: 10 < 6

     a: [3, 5, 8, 6, 10]

    j: 2

    a[j+1] < a[j]: 8 < 6

     a: [3, 5, 6, 8, 10]

    j: 1

    [3, 5, 6, 8, 10]

    可以看到,默认列表前4个数3,5,8,10是从小到大排好序的,然后j从10的坐标3向前遍历到3的坐标1;

    当j为3时,用j坐标后边的值(6)和j坐标的值做对比,如果6小(j[j+1] < a[j]),把6和j坐标的值交换;

    当j为2时,用j坐标后边的值(还是6,因为6已经换到这儿了),如果6小(j[j+1] < a[j]),把6和j坐标的值交换;

    以此类推,就间接的实现了程序的逻辑:用新的数从后往前依次和前面的排好序的数列对比,小于的话就放到前边,类似冒泡排序的反过程,之所以说是间接,是因为对比的过程并不是用新的数6和依次和前边的数做对比,而是用a[j+1]和a[j]这种取坐标的方式作对比,只不过这种下标的方式取得结果看上去是用6和前面的数依次做对比。所以,同一种算法思路可能会有多种实现方式,这里,也可以用临时变量的形式实现直观的用6和前边的数作对比,以后尝试实现。

     

    第二步:将列表的所有元素按照步骤一的逻辑实现

    代码:

    #encodjng=utf-8

     

    a=[9,2,5,1,0,4]

    print a

    index=len(a)-1

    for i in range(index):

        print "i:",i

        for j in range(i,-1,-1):

            print "j:",j

            if a[j+1] < a[j]:

                a[j+1],a[j]=a[j],a[j+1]

                print "a[j+1] < a[j]:","%s < %s"%(a[j+1],a[j])

                print " a:",a

            else:

                break

     

        print a

           

    执行过程:

    D: est>python test.py

    [9, 2, 5, 1, 0, 4]

    i: 0

      j: 0

      a[j+1] < a[j]: 9 < 2

      a: [2, 9, 5, 1, 0, 4]

    [2, 9, 5, 1, 0, 4]

    i: 1

      j: 1

      a[j+1] < a[j]: 9 < 5

      a: [2, 5, 9, 1, 0, 4]

      j: 0

    [2, 5, 9, 1, 0, 4]

    i: 2

      j: 2

      a[j+1] < a[j]: 9 < 1

      a: [2, 5, 1, 9, 0, 4]

      j: 1

      a[j+1] < a[j]: 5 < 1

      a: [2, 1, 5, 9, 0, 4]

      j: 0

      a[j+1] < a[j]: 2 < 1

      a: [1, 2, 5, 9, 0, 4]

    [1, 2, 5, 9, 0, 4]

    i: 3

      j: 3

      a[j+1] < a[j]: 9 < 0

      a: [1, 2, 5, 0, 9, 4]

      j: 2

      a[j+1] < a[j]: 5 < 0

      a: [1, 2, 0, 5, 9, 4]

      j: 1

      a[j+1] < a[j]: 2 < 0

      a: [1, 0, 2, 5, 9, 4]

      j: 0

      a[j+1] < a[j]: 1 < 0

      a: [0, 1, 2, 5, 9, 4]

    [0, 1, 2, 5, 9, 4]

    i: 4

      j: 4

      a[j+1] < a[j]: 9 < 4

      a: [0, 1, 2, 5, 4, 9]

      j: 3

      a[j+1] < a[j]: 5 < 4

      a: [0, 1, 2, 4, 5, 9]

      j: 2

    [0, 1, 2, 4, 5, 9]可以看到,核心还是第一步实现的逻辑(第二层循环);

    当i从第一个数的坐标(0)便利到最后第二个数的坐标(len(a) -1 -1),j就从坐标i往回遍历到坐标0;

    然后用j+1坐标的值和前边的j坐标的值作对比,如果小于,就挪到前边,不小于就跳出;

    这样插入的逻辑就从第一个数执行到最后一个数,整个排序算法就执行完了

  • 相关阅读:
    删数问题
    八中公司_二分图带权最大匹配模板题
    完美子图(这道题太难了,得写下来要不回头又忘了)
    最近集训的图论(思路+实现)题目汇总(内容包含tarjan、分层图、拓扑、差分、奇怪的最短路):
    方格取数(简单版)+小烈送菜(不知道哪来的题)-----------奇怪的dp增加了!
    单调队列优化题:最大数(P1198)
    单调队列+线性dp题Watching Fireworks is Fun (CF372C)
    关于看了几道洛谷灰题(暂无评定)的感想
    洛谷的奇妙今日运势
    互不侵犯(洛谷P1896)
  • 原文地址:https://www.cnblogs.com/xiaxiaoxu/p/9574336.html
Copyright © 2011-2022 走看看