• 插入排序


    插入排序

    • 插入排序

    • 思路:

      • 需要将原始序列分成两部分:有序部分,无序部分

      • 将无序部分中的元素逐一插入到有序部分中

      • 注意:初始情况下,有序部分为乱序序列的第一个元素,无序部分为乱序序列的n-1个元素

      • 乱序序列:[3,8,5,7,6]

      • [3,8,,,,5,7,6]

      • [3,5,8,,,,7,6]

      • [3,5,7,8,,,,6]

      • [3,5,6,7,8,,,]

      • 定义一个变量i,i表示的是有序部分元素的个数&无序部分第一个元素下标。

    #step1:
    #[31,   8,5,7,6]
    i = 1 #i就是有序部分元素的个数&&无序部分第一个元素下标
    #alist[i-1]:有序部分最后一个元素下标
    #alist[i]:无序部分第一个元素下标
    if alist[i-1] > alist[i]:
        alist[i],alist[i-1] = alist[i-1],alist[i]
        #[8,31,   5,7,6]
    
    #step 2:[8,31,   5,7,6]
    i = 2
    #alist[i-1]:有序部分最后一个元素下标
    #alist[i]:无序部分第一个元素下标
    while i>0:
        if alist[i-1] > alist[i]:
            #循环第一次执行[8,5,31,   7,6]
            alist[i-1],alist[i] = alist[i],alist[i-1] 
            i -= 1
            #循环继续执行
            #[5,8,31,   7,6]
        else:
            break
    
    i = 3
    #alist[i-1]:有序部分最后一个元素下标
    #alist[i]:无序部分第一个元素下标
    while i>0:
        if alist[i-1] > alist[i]:
            alist[i-1],alist[i] = alist[i],alist[i-1] 
            i -= 1
        else:
            break
    
    #step 3:
    #处理变量i,需要让i进行自己递增
    for i in range(1,len(alist)): #i = 1,2,3,4
        #alist[i-1]:有序部分最后一个元素下标
        #alist[i]:无序部分第一个元素下标
        while i>0:
            if alist[i-1] > alist[i]:
                alist[i-1],alist[i] = alist[i],alist[i-1] 
                i -= 1
            else:
                break
    
    #完整代码
    alist = [3,8,5,7,6]
    def sort(alist):
        for i in range(1,len(alist)):
            while i>0:
                if alist[i-1] > alist[i]:
                    alist[i-1],alist[i] = alist[i],alist[i-1] 
                    i -= 1
                else:
                    break
        return alist
    #    
    print(sort(alist))
    [3, 5, 6, 7, 8]
    


    总结:以上图为例,当你第一次外层循环时,i**为1(咱们设置的range(1,len(alist))), 索引 i-1 跟 i 比较,当 i-1的元素大于 i 的元素,交换位置。就变成5 8 4 11 10 ,然后i = 2时, i -1的元素就是索引为1,跟索引为2的比较,如果索引为1的大于为2的,继续交换位置,得到5 4 8 11 10 ,没完呢,然后让 i -1 ,循环继续让索引为0的元素跟刚交换完位置的索引变成1的元素比较,就是5 跟4 再比较,如果 索引为1的小于索引为0的,再交换位置,但是上图4小于5,所以会继续交换位置,得到4 5 8 11 10。如果不是就break,跳出循环。就这样前面的都是有序序列了,慢慢的都会变成全部有序。效率上比冒泡和选择快,为啥自己想。

  • 相关阅读:
    poj 1475 Pushing Boxes 推箱子(双bfs)
    poj 1806 Frequent values(RMQ 统计次数) 详细讲解
    poj 2846 Repository
    poj Ping pong LA 4329 (树状数组统计数目)
    POJ 1962-Corporative Network (并查集)
    hdu 2217 Visit
    nyoj304 节能
    与R纠缠的两件事——rownames和子集--转载
    七步精通Python机器学习--转载
    win10专业版激活(亲测可用)
  • 原文地址:https://www.cnblogs.com/zzsy/p/12687097.html
Copyright © 2020-2023  润新知