一、快速排序

定义一个函数 partition(li,left,right) 可以使一个列表中最左端的数正确归位,即去到应该的位置。先对整体使用partition函数,后将从第一次归位后的元素将列表分为两部分,对两部分继续使用partition函数,递归地排完所有序。

quick_sort的思路:

def quick_sort(data,left,right):
    if left < right:
        mid = partition(data,left,right)
        quick_sort(data,left,mid-1)
        quick_sort(data,mid+1,right)

partition的思路:

def partition(li,left,right):
    tmp = li[left]
    while left < right:
        while left < right and li[right] >= tmp:#需要再次判断 left<right 因为外循环此时无法判断,若右侧所有数均大于等于本身,会循环到left = right,此时若没有判断left < right 会继续循环,出现错误
            right -= 1#向左判断一位
        li[left] = li[right]#将比tmp小的数移到left的空位上
        while left < right and li[left] <= tmp:
            left += 1
        li[right] = li[left]#将比tmp大的数移到right的空位上
    li[left] = tmp #把tmp归位
    return left

复杂度o(nlogn)

缺点:有最坏情况以及递归对空间占用很大。

最坏情况:如[9,8,7,6,5,4,3,2,1]

没有减半的操作,会和之前的排序差不多慢

二、堆排序前传)—— 树与二叉树

树是一种数据结构

是一种可以递归定义的数据结构

树是由n个节点组成的集合

n = 0 则这是一棵空树

一些概念

根节点:最上面的节点

叶子节点:后面没有分支的节点

树的深度:纵向节点数量

树的度:分叉数量

子树,孩子节点,父节点

三、二叉树

二叉树就是度为二的树

满二叉树:一个二叉树如果每一个层的节点都达到最大值,则这个二叉树就是满二叉树

完全二叉树:叶子节点只能出现在最下层和次下层,并且最下面一层的节点都集中在该层最左边的若干位置的二叉树。

二叉树的存储方式

链式存储方式(后面讲)

顺序存储方式(用列表存)

实现两个二叉树最常用的功能:父亲找孩子和孩子找父亲。

1.父亲找孩子:父节点下标为i则左孩子节点下标为2i+1右孩子节点下标为2i+2

2.孩子找父亲:子节点下标为i则父节点下标为(i-1)//2(包括左右两个子节点)左孩子节点无论整除与否都行,右孩子节点直接除除不开