参考
堆的概念
- 完全二叉树
- 父节点
>
或<
子节点
分析
- 计算第n个节点的父节点
- 计算第n个节点的子节点
- 将某个节点堆化:将其自己堆化,并且将交换位置的子节点也进行堆化
- 将一个数组构建成堆:从 最后一颗子树父节点
((n-1)/2)
往上依次将各节点堆化 - 堆化后的数组打印顺序是:从上往下,从左往右
- 堆排序:将堆顶元素和最底层的最后一个叶子节点交换并将交换的的最底层的叶子节点移除(并非真正的移除),然后将对顶元素堆化,重复步骤6
方法拆分
- 将某个节点堆化
- 元素交换
- 将数组构建成堆
- 堆排序
实现
package cn.jast.sort;
import java.util.Arrays;
public class Heap {
public void swap(int a[] , int i , int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public void heapify(int a[] , int n , int i){
if(i >= n){
return ;
}
int c1 = 2 * i + 1;
int c2 = 2 * i + 2;
int max = i;
if(c1 < n && a[c1] > a[max]){
max = c1;
}
if(c2 < n && a[c2] > a[max]){
max = c2;
}
if(max != i){
swap(a,i,max);
heapify(a,n,max);
}
}
public void build_heap(int a[] , int n){
int last_node = n-1;
int last_node_parent = (last_node-1)/2;
for(int i = last_node_parent ; i >= 0 ; i--){
heapify(a,n,i);
}
}
public void heap_sort(int a[],int n){
build_heap(a,n);
for(int i = n-1 ; i>=0 ; i--){
swap(a,0,i);
heapify(a,i,0);
}
}
public static void main(String[] args) {
Heap heap = new Heap();
int[] a = {2,1,3,4,6,7,5,9,8};
heap.heap_sort(a,a.length);
System.out.println(Arrays.toString(a));
}
}