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

来源:互联网 发布:2016詹姆斯总决赛数据 编辑:程序博客网 时间:2024/06/04 01:15

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

原创粉丝点击