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坐标的值作对比,如果小于,就挪到前边,不小于就跳出;

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

原文地址:https://www.cnblogs.com/xiaxiaoxu/p/9574336.html