Python数据结构与算法 DAY 03 快速排序&插入排序&二分法查找&二叉函数节点以及数的创建&二叉树深度遍历

本文深入解析Python中的快速排序、插入排序算法,以及二分法查找的实现与效率对比,涵盖算法原理、代码实现及时间复杂度分析。

Python数据结构与算法 DAY 03 重点知识总结 快速排序&插入排序&二分法查找&二叉函数节点以及数的创建&二叉树深度遍历

一 快速排序

快速排序需要注意的一点是它的思想 每一次排序会将比中间数大的数放在中间数的左边 并且将比中间数大的数放在中间数的右边 每一次取的中间数都是列表的第一个数 并采用递归的思想完成
在这里插入图片描述
代码表示如下:
这里需要注意一个部分 外部大循环和内部的小循环 如果内部不加小循环 那么将会报错 根据逻辑来说需要仔细考虑内层循环的条件

def quick_sort(lst,start,end):
    if start >= end:
        return
    # 设定三个游标
    low = start
    high = end
    mid = lst[start]

    # 设立外层循环 主要目的 将数据分为mid左边的数据小于mid mid右边的数据大于mid
    while low<high:
        # 设立内层循环 先从high开始 判断数字大小 如果数字大于mid 则移动游标
        # 如果数字小于mid 则将该数 赋值与左边游标
        while low<high and lst[high] >= mid:
            high -= 1

        lst[low] = lst[high]
        # 设立内层循环 由于赋值为low low将开始向右移动 同样分为两种情况
        while low<high and lst[low] <= mid:
            low += 1
        lst[high] = lst[low]

    # 跳出循环的时候证明 high和low 的游标已经指向同一个了
    lst[high] = mid

    # 使用递归的思想 mid左边和右边的数进行快速排序
    quick_sort(lst,start,low-1)
    quick_sort(lst,low+1,end)

lst = [54,26,93,17,77,31,44,55,20]
quick_sort(lst,0,len(lst)-1)
print(lst)

快速排序的时间复杂度

  1. 最优时间复杂度 : O(nlogn)
  2. 最坏时间复杂度 : O(n^2)
  3. 稳定性 : 不稳定

插入排序

插入排序是一种简单直观的排序算法 它的工作原理是通过构建有序序列 对未排序的数据 在已排序序列中从后向前扫描 找到相应的位置进行插入 插入排序在实现上 在从后向前扫描过程中 需要反复把已有元素逐步向后挪位 为最新元素提供空间
在这里插入图片描述
代码实现如下:

def insert_sort(alist):
    # 从第二个位置,即下标为1的元素开始向前插入
    for i in range(1, len(alist)):
        # 从第i个元素开始向前比较,如果小于前一个元素,交换位置
        for j in range(i, 0, -1):
            if alist[j] < alist[j-1]:
                alist[j], alist[j-1] = alist[j-1], alist[j]

alist = [54,26,93,17,77,31,44,55,20]
insert_sort(alist)
print(alist)

插入排序的时间复杂度:

  1. 最优时间复杂度:O(n) (升序排列 序列已经处于升序的状态)
  2. 最坏时间复杂度: O(n^2)
  3. 稳定性 : 稳定

三 常见的排序算法的效率比较

在这里插入图片描述

四 搜索&二分法查找

搜索是在一个项目集合中找到一个特定项目的算法过程 搜索通常的答案是真的或者假的 因为该项目是否存在 搜索最常见的方法是: 顺序查找 二分法查找 二叉树查找 哈希查找

一 二分法查找

二分法查找又称为折半查找 优点是比较次数少 查找速度快 平均性能号 其缺点事要求待查表格为有序表 且插入删除复杂 因此折半查找方法不适用于经常变动而查找频繁的有序列表
在这里插入图片描述
二分法查找的实现可以分为不使用迭代实现和使用迭代实现

  1. 非迭代方法
    这里需要注意的是最外层的while循环的条件
def scaning_without(lst,number):
    start = 0
    end = len(lst) -1
    while start <= end :
        mid = (start + end + 1) // 2
        if lst[mid] == number:
            return True
        elif number < lst[mid]:
            end = mid-1
        else: # number > lst[mid]:
            start += 1
    return False
  1. 迭代方法
    这里需要注意一下迭代的停止条件
def scaning_within(lst,number,start, end):
    if start>end:
        return False
    mid = (start + end ) // 2
    if lst[mid] == number:
        return True
    else:
        if number < lst[mid]:
            end = mid - 1
            scaning_within(lst,number,start,end)
        else: # number > lst[mid]:
            start = mid + 1
            scaning_within(lst,number,start,end)

五 树和树的算法

  1. 树的特点
    在这里插入图片描述
  2. 树的术语
    在这里插入图片描述
  3. 树的种类
    在这里插入图片描述
二叉树的节点表示以及树的创建
class Node():
    def __init__(self,elem):
        self.elem = elem
        self.lchild = None
        self.rchild = None

class Tree(object):
    """树类"""
    def __init__(self, root=None):
        self.root = root

    def add(self, elem):
        """为树添加节点"""
        node = Node(elem)
        #如果树是空的,则对根节点赋值
        if self.root == None:
            self.root = node
        else:
            queue = []
            queue.append(self.root)
            #对已有的节点进行层次遍历
            while queue:
                #弹出队列的第一个元素
                cur = queue.pop(0)
                if cur.lchild == None:
                    cur.lchild = node
                    return
                elif cur.rchild == None:
                    cur.rchild = node
                    return
                else:
                    #如果左右子树都不为空,加入队列继续判断
                    queue.append(cur.lchild)
                    queue.append(cur.rchild)

if __name__ == '__main__':
    t = Tree()
    t.add(10)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值