排序方法(二)

插入法排序

假设有一个数组L长度为n, 那么假设L[1..n-1]已经排序完毕,那么只需要将L[n]插入到合适的为止即可让L[1..n]有序

'''
From smallest to largest
'''
def insert_sort(list_of_nb):
    '''
    >>> insert_sort([1,5,3,2,4])
    [1, 2, 3, 4, 5]
    '''
    for i in range(1, len(list_of_nb)):
        for j in range(0, i):
            if list_of_nb[i] < list_of_nb[j]:
                insert_value = list_of_nb[i]
                for r in range(i - 1, j - 1, -1):
                    list_of_nb[r + 1] = list_of_nb[r]
                list_of_nb[j] = insert_value
                break
    return list_of_nb

if __name__ == '__main__':
    import doctest
    doctest.testmod()

很愚蠢的插入方法,当要插入值之前,把所有的值向后移位,复杂度似乎为O(n3)

以下是插入法排序的正规做法,复杂度为O(n2)

假设[1..i-1]已经是有序的(从大到小),那么接下来要插入i,

可以想象有n个桶,每个桶里有一个数,当[i]插入一个有数的桶[j]的时候,桶里的数需要拿出来,再从[j..i-1]进行插入。有点动态规划的感觉。

'''
From largest to small
'''
def insert_sort(L_of_nb):
    for i in range(len(L_of_nb)):
        for j in range(i):
            if L_of_nb[i] > L_of_nb[j]:
                L_of_nb[i], L_of_nb[j] = L_of_nb[j], L_of_nb[i]
    return L_of_nb
posted @ 2018-05-25 21:22  AcodingDog  阅读(133)  评论(0编辑  收藏  举报