国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

大根堆實現

2019-11-08 02:53:46
字體:
來源:轉載
供稿:網友

堆:有兩種,一種是大根堆,另一種是小根堆。大根堆的意思是在跟的位置那個數是最大的。同理,小根堆的根元素是最小的。 堆是一個滿的二叉樹,除了最后一個節點可能不是滿的。所以用數組去數組去實現它。一個節點的index為i,則這個節點的兩個子節點的下標應該為2*i+1和2* i+2;父結點那就是(i-1)/2;

下面是大根堆代碼的實現:

public class MyHeap<E extends Comparable<E>> { PRivate Object[] array; private int maxSize; private int currentSize; public MyHeap(int max){ maxSize = max; array = new Object[max]; currentSize = 0; } public boolean isEmpty(){ return currentSize == 0; } /** * 插入節點 * @param e */ public boolean insert(E e){ if(currentSize == maxSize) return false; array[currentSize] = e; checkUp(currentSize++); return true; } /** * 向上移動函數 * @param i */ private void checkUp(int i) { // TODO Auto-generated method stub int parent = (i-1)/2; E object = (E) array[i]; /** * 說一下解決思路:插入的節點是在數組最后一個位置,需要拿到這個節點的父結點,也就是parent的位置 * 然后就跟父結點比較,如果比父結點大的話那就需要去交換,這里可能會忘了數組索引是要大于等于0的 * */ while (i>0&&object.compareTo((E) array[parent])>0) { array[i] = array[parent]; i = parent ; parent = (parent-1)/2; } array[i] = object; } public E remove(){ E e = (E) array[0]; array[0] = array[--currentSize]; checkDown(0); return e; } /** * 使小的節點向下走 * @param i */ private void checkDown(int i) { int laChrid; E e = (E) array[i]; while(i<currentSize/2){ int left = 2*i+1; int right = left +1; E e2 = (E) array[left]; if(right<currentSize&&e2.compareTo((E)array[right])<0) laChrid = right; else { laChrid = left; } if(e.compareTo((E)array[laChrid])>=0) break; array[i] = array[laChrid]; i = laChrid; } array[i] = e; }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 铅山县| 鹿泉市| 隆回县| 高雄市| 周至县| 陵川县| 云霄县| 瑞安市| 云龙县| 上思县| 衡东县| 和平县| 道真| 遂昌县| 宜州市| 嵩明县| 出国| 孟州市| 黑山县| 周至县| 铜川市| 慈利县| 墨脱县| 饶阳县| 普定县| 安宁市| 田东县| 游戏| 济宁市| 永善县| 威信县| 台州市| 离岛区| 靖安县| 通化县| 平昌县| 三河市| 宜宾县| 莱西市| 白玉县| 东辽县|