一、快速排序
定义一个函数 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(包括左右两个子节点)左孩子节点无论整除与否都行,右孩子节点直接除除不开