說(shuō)明
某一個(gè)節(jié)點(diǎn)i父節(jié)點(diǎn),子節(jié)點(diǎn)公式:
父節(jié)點(diǎn)=(i -1)/2
左子節(jié)點(diǎn)=2i+1
右子節(jié)點(diǎn)=2i+1
heapify用于就某一個(gè)i節(jié)點(diǎn)搞堆篇梭,用到遞歸氢橙,如果存在交換,被交換的點(diǎn)要遞歸搞堆恬偷。
buildHeap用來(lái)建立堆充蓝,怎么建立的呢,從最后一個(gè)節(jié)點(diǎn)往上執(zhí)行heapify操作喉磁。想想為什么要這樣做谓苟??因?yàn)閺南峦闲梢源_保下面的先搞成堆涝焙,上面的就可以用下面的了。
int[] arr = {4,10,3,5,1,2,100};
int[] heap = buildHeap(arr,7);
for (int i = 0; i < heap.length; i++) {
Log.i("findnum"," " + heap[i]);
}
private int[] heapify(int [] tree, int size,int i) {
int left = 2 * i + 1;
int right = 2 * i + 2;
if (right > size -1 || left > size -1) {
return tree;
}
int max = i;
if (tree[left] > tree[i]) {
max = left;
}
if (tree[right] > tree[i]) {
max = right;
}
if (max != i) {
int temp = tree[i];
tree[i] = tree[max];
tree[max] = temp;
return heapify(tree, size, max);
}
return tree;
}
private int[] buildHeap(int [] tree, int size) {
int round = 1;
for (int i = size -1; i >= 0 ; i--) {
Log.i("findnum","rount :" + round + "try heap:" + tree[i]);
tree = heapify(tree,size,i);
for (int j = 0; j < tree.length; j++) {
Log.i("findnum"," " + tree[j]);
}
round++;
}
return tree;
}
參考:https://www.bilibili.com/video/av47196993/?redirectFrom=h5