淘先锋技术网

首页 1 2 3 4 5 6 7

列表被分为两部分,还是前半部分是排好序的,后半部分是还没有排序的。
与选择排序法不同的是,插入排序每次选排好序的后面那个元素,依次从后向前与排好序的元素们进行比较大小。
选择排序是从后面部分中找出最小的放到前面去。
插入排序是将后面第一个元素在排好序的列表里面找合适的地方插入进去。
所以需要一个循环控制每次获得乱序部分的第一个元素。
一开始我们认为第一个元素本身就是一个排好序的部分,所以第一步是从第二个元素开始,即alist[1],将alist[1]与alist【0】比较大小,寻找合适的插入位置;第二步是第三个元素alist[2],与前面alist[0]-alist[1]比较大小寻找合适插入位置,……一直到最后一个元素alist[n-1],寻找前面alist[0]-alist[n-2]中合适的插入位置。所以for i in range(1,n)
寻找合适插入位置的操作:每次讲alist[x]依次从后向前与每个元素进行比较,如果alist【x】比较小的话,就交换两者位置,继续向前比较,直到找到比alist[x]小的元素就不交换了,这事就是顺序的了。

def insert_sort(alist):#插入排序
    n = len(alist)
    for i in range(1,n):#要插入的对象
        index = i
        while(index>0):
            if alist[index]<alist[index-1]:
                alist[index],alist[index-1] = alist[index-1],alist[index]
                index -= 1
            else:
                break
    return alist

index是为了记录我们往前寻找合适位置的那个元素的下标,这样才方便交换元素。

时间复杂度:
最优时间复杂度:O(N) (升序排列,序列已经处于升序状态)
最坏时间复杂度:O(N**2)
稳定性:稳定