对堆排序和快速排序进行更新和整理
1. 堆排序(O(nlog(n)))
目的:构建一个大顶堆或小顶堆(堆顶元素为最大或最小)
其实堆的空间结构实际上就是一棵完全二叉树,不过堆有它自己的限定条件。大堆就是树中每个父亲节点都要比孩子节点大,并且两个兄弟之间是没有大小区分的。小堆与之相反,就是每个父亲节点都要比孩子节点小。
堆的空间结构虽然是个完全二叉树,但是这样的结构也是我们为了好理解才想出来的,实际上堆是通过数组的下标进行相应的排序,因为完全二叉树中的结点的编号可以算出来,这样就能与数组进行对应。
操作过程如下:
- 初始化堆:构造成一棵完全二叉树
- 从堆底的子树开始向上,保证每颗子树的根都是大根或小根(因为向上的时候子树的根可能也会被换走,所以每一次调整都要调整到底部),调整结束后,初始堆建立!
大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]
上述的两个公式就是大根堆的建立的基础:
1.1 构建大根堆
1 | //构建大根堆 |
1.2 堆排序
根和数组的尾部元素互换;
对排除尾部元素的剩余数组从0开始进行调整;
1 | //堆排序 |
1.3 移除数组最大值
1 | //删除堆顶元素操作 |
1.4 插入操作(在上一步的基础上)
1 | //插入操作:向大根堆array中插入数据data |