Java基于堆结构实现优先队列功能示例

网友投稿 281 2023-03-15


Java基于堆结构实现优先队列功能示例

本文实例讲述了java基于堆结构实现优先队列功能。分享给大家供大家参考,具体如下:

package Demo;

import java.util.NoSuchElementException;

/*

* 小顶堆 java使用堆结构实现优先队列

*/

public clashttp://s JPriorityQueue {

@SuppressWarnings("hiding")

class QueueNode {

int capacity;

int size;

E[] queue;

QueueNode(int capacity) {

this.capacity = capacity;

}

}

QueueNode node;

public void print()

{

E[] objs=this.node.queue;

for(int i=0;i

{

System.out.print(objs[i]+" ");

}

System.out.println();

}

@SuppressWarnings("unchecked")

public JPriorityQueue(int capacity) {

node = new QueueNode(capacity);

node.size = 0;

BGFnBX node.queue = (E[]) new Object[capacity + 1];

}

public void add(E x) {

int k = node.size;

while (k > 0) {

int parent = (k - 1) / 2;

E data = node.queue[parent];

@SuppressWarnings({ "unchecked", "rawtypes" })

Comparable key = (Comparable) x;

if (key.compareTo(data) >= 0)

break;

node.queue[k] = data;

k = parent;

}

node.queue[k] = x;

node.size++;

}

public E remove() {

int parent = 0;

if (node.size == 0) {

throw new NoSuchElementException("queue is null");

}

E min = node.queue[0];// top

E last = node.queue[node.size - 1];// last

node.queue[0] = last;// add the last to top

node.queue[node.size - 1] = null;

node.size--;

@SuppressWarnings("unchecked")

Comparable super E> complast = (Comparable super E>) last;

if (node.size == 2 && complast.compareTo(node.queue[1]) > 0) { // 只剩下最后两个结点,进行比较

node.queue[0] = node.queue[1];

node.queue[1] = last;

}

if (node.size > 2) { // 大于三个结点的,向下旋转

while (parent < node.size / 2) {

int left = 2 * parent + 1;// left child

int right = left + 1;// right child

E root = node.queue[parent];

@SuppressWarnings("unchecked")

Comparable super E> comproot = (Comparable super E>) root;

if (comproot.compareTo(node.queue[left]) < 0

&& comproot.compareTo(node.queue[right]) < 0)

break;

@SuppressWarnings("unchecked")

Comparable super E> compleft = (Comparable super E>) node.queue[left];

if (compleft.compareTo(node.queue[right]) <= 0) {

node.queue[parent] = node.queue[left];

node.queue[left] = root;

parent = left;

} else {

node.queue[parent] = node.queue[right];

node.queue[right] = root;

parent = right;

}

if (right * 2 >= node.size)

break;

}

}

return min;

}

public static void main(String[] args) {

System.out.println("我们测试结果:");

JPriorityQueue queue = new JPriorityQueue(10);

queue.add("Z");

queue.add("B");

queue.add("QZA");

queue.add("QBA");

queue.add("EAA");

queue.add("A");

http:// queue.print();

// queue.remove();

// queue.remove();

// queue.remove();

// queue.remove();

// queue.remove();

System.out.println(queue.remove());

System.out.println(queue.remove());

System.out.println(queue.remove());

System.out.println(queue.remove());

System.out.println(queue.remove());

System.out.println(queue.remove());

}

}

运行结果:

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

{

System.out.print(objs[i]+" ");

}

System.out.println();

}

@SuppressWarnings("unchecked")

public JPriorityQueue(int capacity) {

node = new QueueNode(capacity);

node.size = 0;

BGFnBX node.queue = (E[]) new Object[capacity + 1];

}

public void add(E x) {

int k = node.size;

while (k > 0) {

int parent = (k - 1) / 2;

E data = node.queue[parent];

@SuppressWarnings({ "unchecked", "rawtypes" })

Comparable key = (Comparable) x;

if (key.compareTo(data) >= 0)

break;

node.queue[k] = data;

k = parent;

}

node.queue[k] = x;

node.size++;

}

public E remove() {

int parent = 0;

if (node.size == 0) {

throw new NoSuchElementException("queue is null");

}

E min = node.queue[0];// top

E last = node.queue[node.size - 1];// last

node.queue[0] = last;// add the last to top

node.queue[node.size - 1] = null;

node.size--;

@SuppressWarnings("unchecked")

Comparable super E> complast = (Comparable super E>) last;

if (node.size == 2 && complast.compareTo(node.queue[1]) > 0) { // 只剩下最后两个结点,进行比较

node.queue[0] = node.queue[1];

node.queue[1] = last;

}

if (node.size > 2) { // 大于三个结点的,向下旋转

while (parent < node.size / 2) {

int left = 2 * parent + 1;// left child

int right = left + 1;// right child

E root = node.queue[parent];

@SuppressWarnings("unchecked")

Comparable super E> comproot = (Comparable super E>) root;

if (comproot.compareTo(node.queue[left]) < 0

&& comproot.compareTo(node.queue[right]) < 0)

break;

@SuppressWarnings("unchecked")

Comparable super E> compleft = (Comparable super E>) node.queue[left];

if (compleft.compareTo(node.queue[right]) <= 0) {

node.queue[parent] = node.queue[left];

node.queue[left] = root;

parent = left;

} else {

node.queue[parent] = node.queue[right];

node.queue[right] = root;

parent = right;

}

if (right * 2 >= node.size)

break;

}

}

return min;

}

public static void main(String[] args) {

System.out.println("我们测试结果:");

JPriorityQueue queue = new JPriorityQueue(10);

queue.add("Z");

queue.add("B");

queue.add("QZA");

queue.add("QBA");

queue.add("EAA");

queue.add("A");

http:// queue.print();

// queue.remove();

// queue.remove();

// queue.remove();

// queue.remove();

// queue.remove();

System.out.println(queue.remove());

System.out.println(queue.remove());

System.out.println(queue.remove());

System.out.println(queue.remove());

System.out.println(queue.remove());

System.out.println(queue.remove());

}

}

运行结果:

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:深入理解ThreadLocal工作原理及使用示例
下一篇:api接口文档模板在哪里(api接口文档生成工具)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~