Heap 排序

来源:互联网 发布:ubuntu 断电日志 编辑:程序博客网 时间:2024/05/20 05:08

Heap排序想必大家都知道。

Heap的主要是通过完全二叉树的形式来构建。这样的构建是平横二叉树(树的高度为lg(N))。

主要特点是:

1. 根节点用来存最大或者最小的树值(利用此特征,可以来做优先队列)。

2. 节点i的值都大于或者小于其子节点(注意啦,heap有,max heap 和min heap之分)。


heap排序的大概流程,也就是

1. 构建heap。

2. 删除根节点,最大或者最小值

3. 重新构建heap, 跳到2,直到heap的size为零。


时间复杂度为O(nlgn)


一下是heap的java版本。

public class MyHeap{public static void main(String[] args){int[] array = {4, 1, 3, 2, 5};MyHeap heap = new MyHeap(array);heap.print();heap.buildHeap();//heap.sort();heap.print();}private int[] array;public MyHeap(int[] array){this.array = array;}public int size(){return array.length;}private void maxHeap(int i){int l = left(i);int r = right(i);int mx = i;if(l < size() && array[l] > array[i])mx = l;if(r < size() && array[r] > array[mx])mx = r;if(mx != i){swap(mx, i);maxHeap(mx);}}public void sort(){buildHeap();for(int i = size() - 1; i >= 0; i--){swap(i, 0);maxHeap(0, i);}}/** * index and size * */private void maxHeap(int i, int len){int l = left(i);int r = right(i);int mx = i;if(l < len && array[l] > array[i])mx = l;if(r < len && array[r] > array[mx])mx = r;if(mx != i){swap(mx, i);maxHeap(mx, len);}}private void swap(int i, int j){int tmp = array[i];array[i] = array[j];array[j] = tmp;}public void buildHeap(){int half = size()/2;for(int i = half; i >=0; i--){maxHeap(i);}}public int left(int idx){return  idx * 2 + 1;}public int right(int idx){return 2 * (idx + 1);}public int parent(int idx){return (idx-1)/2;}public void print(){System.out.print("[");for(int i : array){System.out.print(i + " ");}System.out.println("]");}}



0 0
原创粉丝点击