python 数据结构与算法 day04 插入排序

1. 插入排序

原理: 插入排序也是把序列分为有序序列和无序序列,首先把第一个元素(i=0位置)作为有序序列,比较i=1位置的第二个元素(其实也是待插入的元素)跟有序序列的元素进行比较(从后往前比较)如果比有序序列的元素小就进行交换,如果比有序序列的元素大,就不动,接着找无序序列的下一个待插入的元素,也是 跟有序序列中元素挨个从后往前比对,如果比有序序列的最后一个元素大,就停止 进行下一个带插入元素比较,如果比有序序列最后一个元素小就进行交换,然后接着往前走,遇到比待插入元素大的就交换,直到遇到一个比待插入元素小的元素,那就是待插入元素在有序序列中的恰当位置,接着找下一个待插入元素进行类似比较~

注意:插入排序在把无序序列中的元素插入到有序序列中时,需要比较待插入的元素跟有序序列的元素,但是比较顺序是从有序序列的尾部开始比较的,也就是首先把待插入的元素跟有序序列的最后一个元素进行比较,待插入元素更小就交换,接着往前走,待插入元素还更小就继续交换,继续往前走,直到遇到的原有序序列中某个元素比待插入元素还小,就不再进行移动了,待插入的元素就已经找到了自己的合适位置~

2. 代码实现

def insert_sort(L):
    """插入排序"""
    n=len(L)
    for i in range(1,n): # 首先外层循环执行遍历1-n位置的元素,把后面序列中的元素依次放在前面有序序列的合适位置---复杂度n
        for j in range(i,0,-1):  # 内层循环是对需要插入的元素 和前面已经相对有序的序列进行比较,放在合适的位置(从后往前比较!!从前往后比较不对的)
            if L[j]<L[j-1]:
                L[j-1],L[j]=L[j],L[j-1]  # 如果待插入的元素比有序序列中最后一个元素小就交换,然后继续往前比较,直到遇到比前一个元素大,就停止break 进行下一个待插入元素比较,
            else:
                break
    return L

print(insert_sort([4,2,7,1,9,3,8,0]))

运行结果:

 3. 时间复杂度

插入排序的时间复杂度也是O(n^2)

因为外层循环(把每一个元素都需要插入到前面有序序列的合适位置)需要n的复杂度,然后内层循环是对每一个待插入的元素需要和前面有序序列的每一个元素进行比较(最差的情况是需要从后往前比较到有序序列的第一个元素,当然最好情况是只需要比较一次 也就是对应待插入的元素比有序序列的最后一个最大元素还要大,那就直接放在最后~)

4. 稳定性

插入排序是稳定的

 

5. 优化

上面的程序(有break)已经是优化之后的,也就是对应待插入的元素比有序序列的最后一个元素还要大时,直接停止该次待插入元素的比较,接着进行下一个待插入元素的相同过程比较;

因为前面的已经是有序序列,只要待插入的元素比有序序列的最后一个元素大,就不需要再执行比较操作了~

猜你喜欢

转载自www.cnblogs.com/xuanxuanlove/p/9941550.html