基于Python3的数据结构与算法 - 05 堆排序

本文详细介绍了堆排序中的基础知识,包括树的定义、二叉树特性、堆的定义以及堆排序的过程。重点讲解了堆的向下调整性质和堆排序的时间复杂度,并提到了Python内置的heapq模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、堆排序之树的基础知识

1. 树的定义

2. 树的一些概念

二、堆排序二叉树的基本知识

1. 二叉树的定义

2. 二叉树的存储方式(表达方式)

2.1 顺序存储方式

三、堆

1. 堆的定义

2. 堆的向下调整性质 

四、堆排序的过程 

1. 建造堆

五、时间复杂度

六、内置模块


一、堆排序之树的基础知识

1. 树的定义

  1. 树是一种数据结构  比如:目录结构
  2. 数是一种可以递归定义的数据结构
  3. 树是由n个节点组成的集合:
  • 如果n = 0,那这是一棵空树;
  • 如果n > 0,那存在1个节点作为树的根节点,其他节点可以分为m个集合,每个集合本身优势一棵树。

2. 树的一些概念

  1. 根节点、叶子节点:根节点如下图的A;叶子节点:不能分叉的节点为叶子节点(BCHIKLMNPQ)
  2. 树的深度(即结构共有几层,如下图树的结构有4层,A为第1层,P,Q为第4层)
  3. 树的度(即在树中,那个节点的分叉数最多,如下图中的A,树的度为6)
  4. 孩子节点/父节点(如E节点中,E是I的父节点;I是E的子节点)
  5. 子树(整个树中的一部分,例如EIJQO即为子树。)

二、堆排序二叉树的基本知识

1. 二叉树的定义

二叉树:度不超过2的树,即每个节点最多有两个孩子节点,且两个孩子节点被区分为左孩子节点和右孩子节点

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

完全二叉树:叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。(从满二叉树最后一层拿走几个节点;即相对于满二叉树,最下面一层可以不满,但必须从左到右依次排过来

2. 二叉树的存储方式(表达方式)

  • 链式存储方式
  • 顺序存储方式(堆排序,用列表来存)

2.1 顺序存储方式

观察上图父节点 和孩子节点的编号下标的关系

1. 父节点与左孩子节点的编号下标的关系:

  •  0-1  1-3  2-5  3-7  4-9
  •  i → 2i+1

2. 父节点与右孩子节点的编号下标的关系:

### 数据结构算法中的查找和排序 #### 查找算法概述 查找是指在一个数据集合中寻找特定元素的过程。常见的查找算法包括顺序查找、二分查找(也称为折半查找)、哈希查找等。对于不同的应用场景,选择合适的查找方式至关重要。 - **顺序查找**适用于无序列表,在最坏情况下需要遍历整个列表才能找到目标项。 - **二分查找**则针对有序数组实现高效的搜索操作,通过不断缩小范围来定位目标位置[^2]。 ```python def binary_search(arr, target): low, high = 0, len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 ``` #### 排序算法分类及其特点 排序是对一组对象按照某种规则重新排列的过程。根据是否依赖于比较运算符可分为两大类: - **基于比较的排序**:如冒泡排序、插入排序、希尔排序、快速排序以及堆排序等;这类方法的时间复杂度通常不低于 O(n log n),其中 n 表示待处理的数据量。 - **非基于比较的排序**:例如计数排序、基数排序和桶排序,这些技术利用了数值本身的特性来进行排序,可以在某些特殊条件下达到线性时间性能O(n)。 ##### 堆排序简介 是一种特殊的完全二叉树结构,可以分为最大和最小两种形式。在构建好初始的最大(小)之后,可以通过反复取出根节点并重建的方式完成升序或降序排列的任务。具体来说,堆排序主要涉及两个核心步骤:建过程和调整过程[^3]。 ```c++ void heapify(int arr[], int n, int i){ int largest = i; int l = 2*i + 1; int r = 2*i + 2; if(l<n && arr[l]>arr[largest]) largest=l; if(r<n && arr[r]>arr[largest]) largest=r; if(largest!=i){ swap(&arr[i],&arr[largest]); heapify(arr,n,largest); } } void heapsort(int arr[],int n){ for(int i=n/2-1;i>=0;i--) heapify(arr,n,i); for(int i=n-1;i>0;i--){ swap(&arr[0],&arr[i]); heapify(arr,i,0); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一道秘制的小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值