Python实现常见数据结构算法

一、排序
1.直接插入排序

def straight_insertion_sort(values):#f,i,w
    """直接插入排序"""
    """将1号到n-1号数依次插入前面已排好的有序序列中(序号从0号开始到n-1号),比前驱小则前驱后移继续
    向前比较,比前驱大则插入,重复这个过程n-1次。(适合基本有序,数据量不大)"""
    for i in range(1,len(values)):#依次将1~n个号数插入前面已排序序列
        if values[i] < values[i - 1]:
		#若values[i]的关键码小于前驱,需将values[i]插入有序表
            temp = values[i]#暂存
            j = i - 1
            while values[j] > temp and j >= 0:#从后往前查找待插入位置
                values[j + 1] = values[j]#往后挪位
                j -= 1
            values[j + 1] = temp#复制到插入位置
    return values

2.折半插入排序

def binary_insertion_sort(values):#f,w,i,e,f
    """折半插入排序"""
    for i in range(1,len(values)): #依次将1-n插入前面已排序序列
        temp = values[i]#暂存
        low = 0
        high = i - 1#设置折半查找范围
        while low <= high:#折半查找,先找到目标插入位置low
            mid = (low + high) // 2#取中间点('/'表示浮点数除法,'//'表示整数除法)
            if temp > values[mid]:#查右半子表
                low = mid + 1
            else:#查左半子表
                high = mid - 1
        for j in range(i,low,-1):#统一后移元素,空出插入位置
            values[j] = values[j - 1]
        values[low] = temp#插入操作
    print(values)

3.希尔排序

def shell_sort(values):
    """希尔排序"""
    """"取一个小于n的步长d1,所有距离为d1的倍数的记录放在同一个组,分组后按直接插入排序的规则排序,
    然后再取的第二个步长d2=d1/2,重复以上过程直至步长为1。(仅适用顺序存储的线性表)"""
    n = len(values)
    gap = n//2
    while gap > 0:
        for i in range(gap,n):
            while i >= gap and values[i] < values[i - gap]:
                values[i],values[i - gap] = values[i - gap],values[i],values[i]
                i -= gap
        gap //= 2
    return values

4.冒泡排序

def bubble_sort(values):#f,f,i,i
    """冒泡排序"""
    """"原则上进行n-1趟比较,若为第i趟排序,则将0号到n-i-1号序列中的数j号与j+1号比较,若为顺序,
    则j+1号与j+2号比较,以此类推,若为逆序则交换,将交换后的数以此继续向后比较,若本趟没有发生交换则
    表已有序。"""
    for i in range(len(values) - 1):#冒泡趟数
        flag = False#表示本趟冒泡是否发生交换的标志
        for j in range(len(values) - i - 1):#一趟冒泡过程
            if values[j] > values[j + 1]:#若为逆序
                values[j],values[j 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值