优先队列改进
1.对sink和swim方法的改善
主要是将元素的交换改为直接赋值,减少操作步数,在数据量较大的时候对性能有一定的提高
1 2 3 4 5 6 7 8
| private void swim(int k) { while (k > 1 && greater(k/2, k)) { exch(k, k/2); k = k / 2; } }
|
1 2 3 4 5 6 7 8 9 10
| private void swim(int k) { pq[0] = pq[k]; while (k > 1 && greater(k/2, 0)) { pq[k] = pq[k/2]; k = k / 2; } pq[k] = pq[0]; }
|
1 2 3 4 5 6 7 8 9 10 11
| private void sink(int k) { while (2*k <= n) { int j = 2*k; if (j < n && greater(j, j+1)) j++; if (!greater(k, j)) break; exch(k, j); k = j; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| private void sink(int k) { pq[0] = pq[k]; while (2*k <= n) { int j = 2*k; if (j < n && greater(j, j+1)) j++; if (!greater(0, j)) break; pq[k] = pq[j]; k = j; } pq[k] = pq[0]; }
|