堆排序
基本思想:减治算法。通过堆来选择数据,其中排升序建大堆,排降序建小堆
首先,在这里简单介绍一下二叉堆的概念:二叉堆在逻辑上可视为完全二叉树,在物理上可视为数组,本质上是对于任意一个结点,要求根的值 >=(针对大堆) 所有的子树结点的值,其基本作用是找最值
堆排序主要分为以下三部分:
1.向下调整
- 前提:只有一个位置可能不满足堆的性质,其余位置都已经满足堆的性质
- 1.判断要调整的结点是否为叶子结点(左子树的下标如果越界,就是叶子)
- 2.找最大的孩子(没有右子树,最大孩子就是左孩子;否则,比较左右孩子并且选出最大的孩子)
- 3.比较双亲的值和最大孩子的值,如果双亲大,停止;否则交换两者的值,并以新结点开始继续向下调整
2.建堆
- 对整棵树建堆,需要左右子树已经是堆,对根结点向下调整
- 从最后一个非叶子结点一直到0,不断向下调整
3.堆排序
- 1.建好一个大堆
- 2.采用减治算法,每次选择一个无序部分最大数交换到无序部分的最后面
代码实现:
1.建堆
void createHeap(int[] array){
//1.堆整棵树建堆,需要左右子树已经是堆,对根结点向下调整
//2.从最后一个非叶子结点一直到0,不断向下调整
for(int i = (array.length - 2 ) / 2; i >= 0; i--){
heapify(array , array.length , i);
}