堆排序
堆排序的基本介绍
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,他的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序
堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,注意:没有要求节点的左孩子的值和右孩子节点的值的大小关系。
每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆
堆排序的基本思想
- 将待排序序列构造成一个大顶堆
- 整个序列的最大值就是堆顶的根节点
- 将其与末尾元素进行交换,此时末尾就为最大值
- 然后将剩余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); }
}
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++; } if (arr[j] >temp){ arr[i]=arr[j]; i=j; }else { break; } } arr[i] = temp; } }
|
赫夫曼树
基本介绍
给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树
基本思想
- 从小到大进行排序,将每一个数据,每个数据都是一个节点,每个节点可以看成是一颗简单的二叉树
- 取出根节点权值最小的两颗二叉树
- 组成一颗新的二叉树,该新的二叉树的根节点的权值是前面两颗二叉树根节点的权值的和
- 再将这颗新的二叉树,以根节点的权值大小再次排序,不断重复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){
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); } } }
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; } }
|