插入排序---直接插入排序、折半插入排序、希尔排序

直接插入排序基本原理:对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余的记录为无序序列;接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序的序列中,直至最后一个记录插入到有序序列中为止。

def insert_sort(lists):
    for i in range(1,len(lists)):
        key=lists[i]
        j=i-1
        while j>=0:
            if lists[j]>key:
                lists[j+1]=lists[j]
                lists[j]=key
            j-=1
    return lists

if __name__=="__main__":
    lists=[3,7,8,2,5,6,1]
    print(lists)
    print(insert_sort(lists))

插入排序是一种稳定的排序方法,最好情况下的时间复杂度为O(n),最坏情况下的时间复杂度为 O(n^2),平均情况下的时间复杂度为 O(n^2)。空间复杂度为O(1)。

 

折半插入排序 可以减少比较的次数,每插入一次元素,需要比较的次数最大是折半判定树的深度。

def insert_sort(lists):
    for i in range(1,len(lists)):
        key=lists[i]
        low=0
        high=i-1
        while low<=high:
            mid=(low+high)//2
            if key>lists[mid]:
                low=mid+1
            else:
                high=mid-1
        for j in range(i,low,-1):
            lists[j]=lists[j-1]
        lists[low]=key

    return lists

if __name__=="__main__":
    lists=[3,7,8,2,5,6,1]
    print(lists)
    print(insert_sort(lists))

折半插入排序是一个稳定的排序算法。折半插入排序的时间复杂度为 O(n^2)。

 

希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。

首先要明确一下增量的取法:

      第一次增量的取法为: d=count/2;

      第二次增量的取法为:  d=(count/2)/2;

      最后一直到: d=1;

 

def shell_sort(lists):
    step=int(len(lists)/2)
    while step>0:
        for i in range(step,len(lists)):
            while(i>=step and lists[i-step]>lists[i]):
                lists[i],lists[i-step]=lists[i-step],lists[i]
                i-=step
        step=int(step/2)
    return lists

if __name__=="__main__":
    lists=[3,7,8,2,5,6,1,11,17,24]
    print(lists)
    print(shell_sort(lists))

希尔排序是一种不稳定的排序方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值