java固定队列_Java 使用最大堆实现优先级队列。堆大小固定,并使用数组表示。...

import java.util.Arrays;/** from 时 代 J a v a 公 众 号 - nowjava.com**/

public class PriorityQueue {

int[] heap;

int size;

// Constructor initializes instance variables

public PriorityQueue(int maxSize) {

heap = new int[maxSize];

size = 0;

}

// Push an element on to the queue

public void push(int val) {

// If the queue is full then throw an exception

if (size == heap.length)

throw new IllegalStateException();

// Put the value in the next available space in the queue

int pos = size;

heap[pos] = val;/*来 自 n o w j a v a . c o m*/

// While val is bigger than its parent, swap it with its parent

while (pos > 0) {

// Get the parent and compare the values

int parent = (pos + 1) / 2 - 1;

if (heap[parent] >= heap[pos])

break;

swapIndices(parent, pos);

pos = parent;

}

// We added an element so increment the size

size++;

}

// Pop the max element from the queue

public int pop() {

// If the queue is empty, throw an exception

if (size == 0)

throw new IllegalStateException();

// The top of the heap is the first item in the array, so save it off

// to the side so we don't lose it

int toReturn = heap[0];

// Move the bottom item in the heap to the first position. We don't need

// to remove it from the array because we have the size variable

heap[0] = heap[size - 1];

size--;

// Bubble down the top element to the right spot

int pos = 0;

// We're going to be swapping with the children and any pos >= size / 2

// doesn't have any children

while (pos < size / 2) {

int leftChild = pos * 2 + 1;

int rightChild = leftChild + 1;

// If the right child exists and is greater than the left child,

// compare it to the current position

if (rightChild < size && heap[leftChild] < heap[rightChild]) {

// Only swap if the value is less than the child

if (heap[pos] >= heap[rightChild])

break;

swapIndices(pos, rightChild);

pos = rightChild;

} else {

// Do the same comparison with the left child

if (heap[pos] >= heap[leftChild])

break;

swapIndices(pos, leftChild);

pos = leftChild;

}

}

return toReturn;

}

// Swap the values at the indices

private void swapIndices(int i, int j) {

int temp = heap[i];

heap[i] = heap[j];

heap[j] = temp;

}

public static void main(String[] args) {

tester(new int[] {}, "Empty");

tester(new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }, "Ascending order");

/**代码未完, 请加载全部代码(NowJava.com).**/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值