【最小堆】--排序 -- Timer 最小堆 舉例
阿新 • • 發佈:2018-12-01
1 陣列中增加元素,從底層上升 保證最小堆
private void fixUp(int k) { while (k > 1) { int j = k >> 1; if (queue[j].nextExecutionTime <= queue[k].nextExecutionTime) break; TimerTask tmp = queue[j]; queue[j] = queue[k]; queue[k] = tmp; k = j; } }
1.5 刪除元素
/** * Remove the head task from the priority queue. */ void removeMin() { queue[1] = queue[size]; queue[size--] = null; // Drop extra reference to prevent memory leak fixDown(1); }
2 陣列中減少元素 ,從上層下降保證最小堆
private void fixDown(int k) { int j; while ((j = k << 1) <= size&& j > 0) { if (j < size && //注意是小於 少一次運算 queue[j].nextExecutionTime > queue[j+1].nextExecutionTime) j++; // j indexes smallest kid if (queue[k].nextExecutionTime <= queue[j].nextExecutionTime) break; TimerTask tmp = queue[j]; queue[j] = queue[k]; queue[k] = tmp; k = j; } }
3 整體堆排序 注意:為什麼從 size/2 開始?和logn的關係
void heapify() { for (int i = size/2; i >= 1; i--) fixDown(i); }