面试-排序-(二)插入排序

一、插入排序:每一趟将一个待排序的元素,按其关键字的大小插入到已排序序列的适当位置,直到全部插入完成。

常见的插入排序有以下三种。

1、直接插入排序

1)过程:直接插入排序是一种最简单的排序方法,其过程就是依次将每个元素插入到一个有序的序列中去。不过它有个缺点,就是当我们的数据基本有序时,每次插入都要移动位置,此时的插入效率是很低的。为了解决这种情况,又产生了拆半插入排序,希尔排序。

工作原理:插入排序在实现上,从后面向前扫描(一开始从下标为1的元素开始,往下标为0的元素遍历),在扫描过程中,需要反复把已排序元素逐步向后挪位,为最新的元素提供插入位置。

直接插入排序示意图

2)python实现:

def sort3(a):
    for i in range(1,len(a)):
        for j in range(i,0,-1):
            if a[j-1] > a[j]:
                a[j],a[j-1] = a[j-1],a[j]
    return a

3)复杂度

空间复杂度:O(1)

时间复杂度:

平均 O( n^{2}

最好 O(n) :初始数据序列正序时

最坏 O( n^{2}) :初始数据序列反序时

 

2、拆半插入排序

1)过程:对直接插入排序寻找合适插入点时,用了类似二分法的寻位方法

2)python实现:

#折半插入排序=直接插入排序+二分查找
def sort4(a):
    for i in range(1,len(a)):
        tmp = a[i]
        low = 0
        high = i-1
        #查找位置
        while low <= high:
            mid = (low + high) // 2
            if tmp > a[mid]:
                low = mid +1
            else:
                high = mid -1
        #插入元素
        for j in range(i,low,-1):
            a[j] = a[j-1]
        a[low] = tmp
    return a

3)复杂度

空间复杂度:O(1)

时间复杂度:

平均 O( n^{2})

相比直接插入排序减少了关键字的比较次数,但元素的移动次数不变。

3、希尔排序

1)过程:希尔排序又称缩小增量排序,基本思想:把元素按下标的一定增量d分组,对每组元素采用直接插入排序的方法进行排序,然后随着增量不断减小,直到d为1,整个数据合为一组有序序列。

希尔排序示意图

2)python实现:

def sort5(a):
    step = len(a) // 2
    while step > 0:
        for i in range(step,len(a)):
            for j in range(i,0,-step):
                if a[j] < a[j-step]:
                    a[j],a[j-step] = a[j-step],a[j]
        step //= 2
    return a

3)复杂度

空间复杂度:O(1)

时间复杂度:

平均 O( n^{1.3})

最好 O(n)

最坏 O( n^{2} )

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值