排序算法-Python

冒泡 bubble_sort

def bubble_sort(li):  # 这个其实是选择排序
    for i in range(len(li) - 1):  # 趟数
        max_id = 0  # 本趟最大值下标
        exchange = False
        for j in range(1, len(li) - i):  # 无序区间
            if li[max_id] < li[j]:
                max_id = j
            else:
                exchange = True
        if not exchange:
            break
        li[max_id], li[len(li)-1-i] = li[len(li)-1-i], li[max_id]

选择 select_sort

def select_sort(li):
    for i in range(len(li)-1):  # 趟数
        min_idx = i
        for j in range(i+1, len(li)):
            if li[min_idx] > li[j]:
                min_idx = j
        li[min_idx], li[i] = li[i], li[min_idx]

插入 insert_sort

def insert_sort(li):
    for i in range(1, len(li)):  # 摸的第i手牌
        j = i - 1
        tmp = li[i]
        while j >= 0 and tmp < li[j]:  # 有序区
            li[j+1] = li[j]
            j -= 1
        li[j+1] = tmp

快排 quick_sort

# 给定元素P(默认子列表的第0个元素),给P归位,返回P的下标
def partition1(li, left, right):
    # 先从右边开始比较
    while left < right:
        while left < right and li[right] >= li[left]:
            right -= 1
        li[right], li[left] = li[left], li[right]
        while left < right and li[left] < li[right]:
            left += 1
        li[left], li[right] = li[right], li[left]
    return left


def partition(li, left, right):
    # 这个理解起来更简单
    tmp = li[left]
    while left < right:
        while left < right and li[right] >= tmp:
            right -= 1
        li[left] = li[right]
        while left < right and li[left] < tmp:
            left += 1
        li[right] = li[left]
    li[left] = tmp
    return left


def _quick_sort(li, left, right):
    if left >= right:
        return
    mid = partition(li, left, right)
    _quick_sort(li, left, mid-1)
    _quick_sort(li, mid+1, right)


@cal_time
def quick_sort(li):
    _quick_sort(li, 0, len(li)-1)

堆排 heap_sort

def sift(li, low, high):
    new_item = li[low]  # 代表要调整的数
    i = low  # 指向空出来的位置
    j = i * 2 + 1  # 初始指向左子节点
    while j <= high:
        if j < high and li[j] < li[j+1]:
            j = j + 1
        if new_item < li[j]:
            li[i] = li[j]
            i = j
            j = i * 2 + 1
        else:
            break
    li[i] = new_item


@cal_time
def heap_sort(li):
    """堆排序"""
    n = len(li)
    # 构建大根堆
    for root in range((n-2) // 2, -1, -1):
        sift(li, root, n-1)
    # 出数
    for i in range(n-1, 0, -1):
        li[0], li[i] = li[i], li[0]
        sift(li, 0, i-1)

计时

def cal_time(func):
    def inner(*args, **kwargs):
        start = datetime.now().timestamp() * 1000
        func(*args, **kwargs)
        spend = datetime.now().timestamp() * 1000 - start
        if spend > 9999:
            spend_str = '%ds' % (spend/1000)
        else:
            spend_str = '%dms' % spend
        print('it spends %s' % spend_str)
    return inner
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法图解-python.pdf》是一本介绍算法和使用Python语言实现算法的书籍。该书的目的是帮助读者了解算法的基本概念和原理,并通过Python编程实践来加深理解。 这本书以图解的方式呈现算法的思想和应用,使复杂的算法问题变得直观易懂。读者可以通过阅读该书,学习到各种常见的算法设计和解决思路,如排序算法、搜索算法、图算法等。同时,该书也会介绍一些高级算法,如动态规划、贪婪算法等,以及如何通过Python语言实现这些算法。 《算法图解-python.pdf》的内容结构清晰,通俗易懂。每个算法都有详细的解释和示例代码,读者可以通过实际编程来加深对算法的理解。此外,书中还包含了一些挑战性的练习题,供读者进一步巩固所学的知识。 通过阅读《算法图解-python.pdf》,读者不仅可以学习到算法的基本知识,还可以了解到如何运用Python语言实现这些算法。这对于刚开始学习算法Python编程的读者来说是非常有帮助的。无论是计算机科学专业的学生,还是对算法感兴趣的爱好者,都可以从这本书中受益匪浅。 总之,《算法图解-python.pdf》是一本很好的算法入门书籍,以图解和Python编程为特色,适合各类读者学习和参考。通过阅读和实践,读者可以提高算法设计和编程实现的能力,为解决实际问题提供有效的思路和方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值