排序方法(二)
插入法排序
假设有一个数组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