堆排序
package com.shizhong.tree;
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args){
int[] arr = {
4, 6, 8, 5, 9, 1, -11, 23, 4444,-111,999, -22222};//要求将数组进行升序排列, 即采用大顶堆方式,将最大元素下沉
heapSort(arr);
}
//编写一个堆排序的方法
public static void heapSort(int[] arr) {
int temp = 0;
System.out.println("堆排序");
for (int i = arr.length / 2 - 1; i >= 0; i--) {
//其中i = arr.length / 2 - 1表示最后一个非叶子节点的索引,
// 因为这里是完全二叉树,当前节点n的左子节点为2n+1,右子节点为2n+2,父节点为(n-1)/2,
// 最后一个非叶子节点索引为arr.length / 2 - 1
adjustHeap(arr, i, arr.length);
}
for (int j = (arr.length - 1); j > 0; j -= 1) {
temp = arr[j];
arr[j] = arr[0];
arr[0] = temp;
adjustHeap(arr, 0, j);
}
System.out.println("数组=" + Arrays.toString(arr));
}
//将一个数组(即一个二叉树)调整成一个大顶堆
/**
*功能:将i对应的非叶子节点调整成对应大顶堆
* @param arr 待调整的数组
* @param i 表示非叶子节点在数组中的索引
* @param length 表示对多少个元素进行调整,其中length是逐渐降低的
*/
public static void adjustHeap(int[] arr, int i, int length) {
int temp = arr[i];//先取出当前非叶子节点i对应的数
for (int k = 2 * i + 1; k < length; k = k * 2 + 1) {
//这里k表示i非叶子节点的左子节点,
// k = k * 2 + 1表示取i非叶子节点的左子节点和左子节点
if (k + 1 < length && arr[k] < arr[k + 1]) {
//i 非叶子节点的左子节点小于右子节点的值
k++;//k就指向右子节点
}
if (arr[k] > temp) {
arr[i] = arr[k];//将较大的值赋给i非叶子节点
i = k;//让k成为非叶子节点
}else {
break;
}
}
//当for循环结束后,就已经将以i为父节点的最大值放在了局部的最顶
arr[i] = temp;
}
}
赫夫曼树
package com.shizhong.huffmantree;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
public class HuffmanTree {
public static void main(String[] args){
int[] arr = {
13, 7, 8, 3, 29, 6, 1};
Node root = creatHuffmanTree(arr);
preOrder(root);
}
//编写一个前序遍历的方法
public static void preOrder(Node root){