/**
* 堆排序
* 需要满二叉树
* 跟节点的值必须大于孩子节点
*/
public class HeapSort {
public static void main(String[] args) {
int[] tree = {1,2,3,4,5,6,7,7,8,9,10};
for (int treeNode = tree.length; treeNode > 0; treeNode--) {
//找到最后面的一个父节点
int parentNode = (treeNode - 1)/2;
buildHeap(tree, parentNode, treeNode);
//当找到最大的节点时,和最后一个节点交换,然后treeNode就要减去一个
exchange(tree, 0, treeNode-1);
}
//输出结果
for (int a: tree) {
System.out.print(a + " ");
}
}
/**
* 所有的父节点实现heapify操作,这样最后根节点就保证为最大值
* @param tree 满二叉树
* @param parentNode 从第几个节点开始heapify操作
* @param treeNode 满二叉树的节点个数
*/
public static void buildHeap(int[] tree, int parentNode, int treeNode){
for (int i = parentNode; i >= 0; i--) {
heapify(tree, treeNode, i);
}
}
/**
* 实现父节点的值为最大
* @param tree 堆的树
* @param treeNode 树的结点个数
* @param parentNode 父节点
*/
public static void heapify(int[] tree,int treeNode, int parentNode){
int childrenRight = 2 * parentNode + 1;
int childrenLeft = 2 * parentNode + 2;
if(childrenRight < treeNode && tree[childrenRight] > tree[parentNode]){
exchange(tree, childrenRight, parentNode);
}
if(childrenLeft < treeNode && tree[childrenLeft] > tree[parentNode]){
exchange(tree, childrenLeft, parentNode);
}
}
/**
* 交换tree的两个节点的值
* @param tree 完全二叉树
* @param nodeNext1 节点下标
* @param nodeNext2 节点下标
*/
public static void exchange(int[] tree, int nodeNext1, int nodeNext2){
int empty;
empty = tree[nodeNext1];
tree[nodeNext1] = tree[nodeNext2];
tree[nodeNext2] = empty;
}
}
java堆排序的实现
最新推荐文章于 2024-07-26 12:28:02 发布