堆排序

堆排序的基本介绍

堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,他的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序

堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,注意:没有要求节点的左孩子的值和右孩子节点的值的大小关系。

每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆

堆排序的基本思想

  1. 将待排序序列构造成一个大顶堆
  2. 整个序列的最大值就是堆顶的根节点
  3. 将其与末尾元素进行交换,此时末尾就为最大值
  4. 然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便得到一个有序序列了

代码实现

public class HeapSort {
public static void main(String[] args) {
int arr[] = {4, 6, 8, 5, 9};
heapSort(arr);
}

//编写一个堆排序的方法
public static void heapSort(int arr[]) {
//将无序序列构建成一个大顶堆
for (int i = arr.length/2 -1; i >=0; i--) {
adjustHeap(arr,i,arr.length);
}
//将堆顶元素与末尾元素交换,重新调整结构,使其满足堆定义, 然后
//继续交换堆顶元素与当前末尾元素,反复执行调整
int temp =0;
for (int i =arr.length-1; i >0 ; i--) {
temp =arr[i];
arr[i]=arr[0];
arr[0]=temp;
adjustHeap(arr, 0, i);
}

}

/**
*
* @param arr 待调整的数组
* @param i 表示非叶子节点在数组中的索引
* @param lenght 表示对多少个元素继续调整,lenght 是在逐渐减少
*/

//将一个数组,调整成一个大顶堆
public static void adjustHeap(int arr[], int i,int lenght){
int temp =arr[i];
for (int j = i*2+1; j <lenght ; j=j*2+1) {
if (j+1<lenght && arr[j] <arr[j+1]){ //说明左子节点的值小于右子节点的值
j++; //j指向右子节点
}
if (arr[j] >temp){ //如果子节点大于父节点
arr[i]=arr[j]; //把较大的值赋给当前节点
i=j; // i 指向J 继续循环比较
}else {
break;
}
}
arr[i] = temp; //将temp值放到调整后的位置
}
}

赫夫曼树

基本介绍

给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树

基本思想

  1. 从小到大进行排序,将每一个数据,每个数据都是一个节点,每个节点可以看成是一颗简单的二叉树
  2. 取出根节点权值最小的两颗二叉树
  3. 组成一颗新的二叉树,该新的二叉树的根节点的权值是前面两颗二叉树根节点的权值的和
  4. 再将这颗新的二叉树,以根节点的权值大小再次排序,不断重复1-2-3-4的步骤,直到数列中,所有的数据都被处理,就得到了一棵赫夫曼树

代码实现

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class HuffmanTree {
public static void main(String[] args) {
int arr[] = {13,7,8,3,29,6,1};

}
//创建赫夫曼树的方法
public static void createHuffmanTree(int[] arr){
/*
遍历arr数组
将arr的每个元素构成一个Node
将Node放入到ArrayList中
*/
List<Node> nodes =new ArrayList<Node>();
for (int value: arr
) {
nodes.add(new Node(value));
}
while (nodes.size()>1) {
//排序
Collections.sort(nodes);

//取出根节点权值最小的两颗二叉树

Node left = nodes.get(0);
Node right = nodes.get(1);

//构建一颗新的二叉树
Node parent = new Node(left.value + right.value);
parent.left = left;
parent.right = right;

nodes.remove(left);
nodes.remove(right);
nodes.add(parent);
}
}
}
//创建节点类
//为了让Node 对象持续排序Collections集合排序

class Node implements Comparable<Node>{
int value;
Node left;
Node right;

public Node( int value){
this.value = value;
}

@Override
public String toString() {
return "Node{" +
"value=" + value +
'}';
}

@Override
public int compareTo(Node o) {
return this.value -o.value;
}
}