小天花板堆:任一节点小于左右孩子的节点的值(大天花板堆是更大的值。 文中以小天花板堆为例)在概念上是完全二叉树,取决于完全二叉树的父子节点顺序之间的特殊代数关系。
//对于节点n,其左子l、右子r、父节点p、//分别表示宽度遍历顺序: 0、1、2、3 . x,l=2 * n 1; r=2 * n 2; p=(n-1 )/2; //因为保留整数部分,所以不使用真正复杂的树链表结构,就可以用线形表表示堆。
通过使用实现和说明类安装以下方法可以运行: 在java中,可以使用PriorityQueue来存储任何对象。 使用的是微型堆的概念,可以实现自己的排序规则——对象来实现comparable接口。
publicstaticvoidmain (string [ ] args ) int [ ] data={ 4,3,7,- 1,4,234,23,65,100,5,1,8,5 }; HEAP(data,data.length ); 出局(数据); pollmin(data; system.out.println(‘000 ); for(intI=0; i data.length – 1; I ) system.out.println(data[I]; } privatestaticvoidsout (int [ ] data ) for ) intI:data ) system.out.println ) I; } } /** *将数组映射为小顶堆* @param data * @param n调整范围*/publicstaticvoidheap (int [ ] data,int n ) for(intI=1; i n; I ) { int t=i; while(t!=0data[parent(t(t ) ]=data[t] ) swap (data,t,parent ) ); t=parent(t; } } publicstaticvoidswap (int [ ] data,int a,int b ) { int temp=data[a]; data[a]=data[b]; data[b]=temp; (} /** *堆排序,小顶部堆排序结果按降序(@paramdata ) @paramn数据集的排序范围(/publicstaticvoidASC(int ) data,int n ) ) for i=0; I—-{swap(data,0,I ); siftdown(data,I ); } } /** *在数组末尾添加元素,然后添加* @ param data * @ paramx */publicstaticvoidaddmin (int [ ] data,int x ) data [ data.lengin ] int while(parent(i(I )=0data[I]data[parent(I ) ] ) swap(data,I,parent ) ); I=parent(I; } } /** *离开堆后,将尾部元素添加到根节点,并调整堆。 当前根节点下沉到离开堆后的上一个位置。 * @ param data * @ return */publicstaticintpollmin (int [ ] data ) intret data [0]=data [ data.length-1 ]; siftdown(data,data.length – 1 ); 返回; } /** *将尾部节点的值放在根节点的位置,并将该节点放在* @param data * @param n当前尾部节点的位置*/privatestaticvoidsiftdown (int [ ] data,int n ) ) while(true ) if ) I=n-1 ) break; //find min in i,i.lchild,rchild int l=2 * i 1; int r=2 * i 2; int min=i; if(L=n-1data[L]data[I] ) min=l; if(r=n-1data[r]data[min] ) min=r; //当前节点最小时调整结束if(min==I ) break; SWAP(data,I,min ); i=min; }权限静态部件(intt )返回(t-1 )/2; }作用用于处理面试中的相关问题,动态维护前k小的值,效率相对较高(nlog(n ) ) ) ) ) ) ) ) ) ) ) ) )。