美文网首页
八大排序之直接插入排序

八大排序之直接插入排序

作者: beckerhanqq | 来源:发表于2018-01-14 21:31 被阅读0次
    • 我们一般最开始接触的排序就是插入排序,它看上去非常简单,可是如果没有弄清楚他的细节,自己手写一个插入排序,也是会出各种错,甚至就是写不出来,直到看到答案,再恍然大悟,奥,然后下次还是写不出,不用说,本人就经历过几次这样的情景,所以,虽然简单,还是有必要踏踏实实弄清楚这个最基础的算法。

    处理方法

    1. 初始状态:有一个n个元素的数组待排序,迭代指针初始为第二个元素 (下标为1),设该元素为key,key左侧的元素在初始时是有序的,很好理解,因为初始时,key左侧只有一个元素,一个元素是有序的。

    2. 迭代状态:将key插入左侧有序的数组,然后迭代指针右移一位。

    3. 终止状态:迭代指针到了整个数组的最后一位,并将最后一位插入到了左侧对应的位置,排序完成。

    细节处理

    • 我们用最简单的整数排序来做例子
    • c是一个整数数组, 变量i用来标志1到len(c)的数组下标,初始时i = 1, key = c[i] = c[1],变量j用来标志key左侧有序数组的下标,初始时,j = 0,c[j] = c[0]
    • 我们需要用一个双层循环来处理这个排序,外层循环的上下界是1和len(c), 左侧已排序的数组的上下界是0和j
    • 如下代码:
    c = []
    for i in range(5):
        item = int(raw_input("请输入数值:"))
        c.append(item)
    
    length = len(c)
    for i in range(1, length):
        j = i - 1
        key = c[i]
        while j >= 0:
            if key < c[j]:
                c[j], c[j + 1] = c[j + 1], c[j]
            j -= 1
    
    print c
    

    外层循环,是由前向后迭代1-len(c),内层循环是由后向前迭代0-j,如果key小于c[j],就交换c[j]和c[j+1],j-=1

    ps

    • 用python实现这个排序,网上有很多教程,在交换c[j]和c[j+1]的时候,引入了一个中间变量,像c语言,两个值交换的时候,需要引入中间变量,但是在python里,可以直接交换,上面这样写比较pythonic。

    相关文章

      网友评论

          本文标题:八大排序之直接插入排序

          本文链接:https://www.haomeiwen.com/subject/qgyloxtx.html