堆排序
堆排序(看一万遍视频不如自己亲自手撸一次伪代码)
学习堆排序前的预备知识
- 二叉树 :至少了解 什么是完全二叉树, 二叉树的节点和左右子节点的关系
- 二叉树的BFS(广度优先遍历) 理解即可;
- 有一定的数组排序训练
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法[^1] 功能;
初步建立大顶堆伪代码
/**
* 将数组转换为大顶堆:
* 伪代码:
* Arr: 数组
* i : 数组下标(树的当前节点)
* n : 数组的长度(树的节点数)
*
*
* MaxHeapDown(Arr , i , n){
* //先判断树的节点是否为空(数组下标i是否越界)
* //如果越界:
* if(i >= n):
* return
* //再找 当前树节点的左右子树
* left = i*2+1 (树的性质 :左子树节点等于 i*2+1)
* right = i*2+2
*
* //判断节点 i的左子树是否越界
* if(left >= n):
* left = -1
* //判断节点 i的右子树是否越界
* if(right >= n):
* right = -1
*
* //左右子树都越界(则该节点为 叶子节点无需操作)
* if(left ==-1 && right == -1 ):
* return ;
*
* //如果 节点i 是集合 (节点i,节点i的左子树,节点i的右子树)中的最大值,无需操作(前提左右子树为非空)
* if(left!=-1 && right!=-1):
* if(Arr[i] >= Arr[left] && Arr[i] >= Arr[right]):
* return
* //否则 节点i 和集合 (节点i的左子树,节点i的右子树)中的 最大值交换
* esle:
* if(Arr[left]>Arr[right]):
* max_index = left
* else:
* max_index = right
* temp = Arr[i]
* Arr[i] = Arr[max_index]
* Arr[max_index] = temp
*
*
*
* //存在这种情况 右子树是空树,左子树为非空 (右子树为非空,左子树为空树这种情况 由数组转换为堆根本就不存在!!!无需考虑)
* //如果在此情况下 左子树的值 大于 i节点的值 ,交换
* if((left != -1 && right == -1) && Arr[i]<Arr[left]):
* temp = Arr[i]
* Arr[i] = Arr[left]
* Arr[left] = temp
* }
*
*/
初步建立大顶堆的动图
这个LeetCode有许多优秀的动图题解就不班门弄斧了。
堆排序步骤
1.初步建立大顶堆
2.将堆中最后一个节点(数组最后一个元素进行)和堆第一个元素进行交换
*3.缩小堆的范围进行建立大顶堆(比如: 最开始初步大顶堆的范围是 数组. 长度
,交换后缩小为数组. 长度-1
4.直到堆为范围0时候,退出堆排序,得到排序好的