1. 程式人生 > >【最小堆】--排序 -- Timer 最小堆 舉例

【最小堆】--排序 -- Timer 最小堆 舉例

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);
}