利用无序数组实现优先队列并排序数组——ADT实现
来源:互联网 发布:淘宝网儿童棉服 编辑:程序博客网 时间:2024/04/30 10:01
优先队列的实现有多中实现方法,下面给出利用无序数组实现优先队列并排序数组:
/*****************************抽象数据类型***********************/
package pk.adt;
public interface ComparisonKey {
int compareTo(ComparisonKey value);
String toString();
}
package pk.adt2;
import pk.adt.ComparisonKey;
public class PQItem implements ComparisonKey {
private int key;
public PQItem(int value) {
key = value;
}
public String toString() {
return Integer.toString(key);
}
public int compareTo(ComparisonKey value) {
int a = this.key;
int b = ((PQItem) value).key;
return ((a == b) ? 0 : ((a > b) ? 1 : -1));
}
}
/*****************************优先队列的定义***********************/
package pk.priorityQueue;
import pk.adt.*;
public class PriorityQueue {
private int count;//优先队列中的元素数目
private int capacity;//可用数组位置的数目
private int capacityIncrement;//增量
private ComparisonKey[] itemArray;//含有PQ元素的数组
public PriorityQueue() {
count = 0;
capacity = 10;
capacityIncrement = 5;
itemArray = new ComparisonKey[capacity];
}
public int size() {
return count;
}
public void insert(ComparisonKey newItem) {
if (count == capacity) {//itemArray长度不够时,扩展增量
capacity += capacityIncrement;
ComparisonKey[] tempArray = new ComparisonKey[capacity];
for (int i = 0; i < count; i++) {
tempArray[i] = itemArray[i];
}
tempArray = itemArray;
}
itemArray[count++] = newItem;
}
public ComparisonKey remove() {
if (count == 0) {
return null;
} else {
int maxPosition = 0;
ComparisonKey maxItem = itemArray[0];
for (int i = 0; i < count; i++) {//找到优先级最高的元素的位置
if (itemArray[i].compareTo(maxItem) > 0) {
maxPosition = i;
maxItem = itemArray[i];
}
}
itemArray[maxPosition] = itemArray[--count];//将末端元素移至删除最高优先级元素所造成的空位置
return maxItem;
}
}
}
/*****************************测试案例Applet***********************/
package pk.applet;
import java.applet.Applet;
import pk.adt.*;
import pk.adt2.*;
import pk.priorityQueue.*;
public class PQApplet extends Applet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void init() {
int n = 10;
ComparisonKey[] A = new ComparisonKey[n];
for (int i = 0; i < n; i++) {
A[i] = new PQItem(square(3 * i - 13));
}
System.out.println();
priorityQueueSort(A);//对数组A进行排序
for (int i = 0; i < n; i++) {
System.out.print(A[i] + ",");
}
}
public int square(int x) {
return x * x;
}
public void priorityQueueSort(ComparisonKey[] A) {
int i;
int n = A.length;
PriorityQueue PQ = new PriorityQueue();
for (i = 0; i < n; i++) {
PQ.insert(A[i]);//PQ为空队列,将数组中无序元素插入队列PQ中
}
for (i = n - 1; i >= 0; i--) {
A[i] = PQ.remove();//将队列PQ中的元素按优先级删除,并把删除元素排序插入数组A中
}
}
}
性能分析:
利用无序数组实现优先队列时,插入元素很简单,直接在PQ类型的队列(数组)的尾部插入一个新的元素。而删除元素的时候,我们必须找到优先级最高的那个元素,然后在删除,最后将末端元素移至删除最高优先级元素所造成的空位置。删除元素是平均需要移动一半的元素,插入操作需要O(1)的时间,而删除操作需要O(N)的时间。若用有序链表实现优先队列,则插入操作需要O(N)的时间,而删除操作需要O(1)的时间。
- 利用无序数组实现优先队列并排序数组——ADT实现
- 优先队列的数组实现
- 有序数组实现优先队列
- 优先队列C++数组实现
- 利用数组和链表实现优先队列
- 实现无序数组
- 利用数组实现队列操作
- 利用数组实现单向队列
- 利用堆实现堆排序&优先队列
- 利用堆实现堆排序&优先队列
- poj3125(优先队列数组实现)
- 优先队列的数组、二叉堆实现
- 优先队列的数组实现(有序)
- 无序链表实现优先队列
- 队列——数组实现
- 循环队列—数组实现
- 队列的实现—由数组实现
- 小程序(4)——优先队列(基于静态数组的最小堆实现)
- hdu 2846 字典树
- 性能改善的一种模式
- 诺基亚中国市场严重衰退销量剧减64%
- EffectiveC++ Item12
- 繁体字非主流伤感日志_親愛的,為什麼
- 利用无序数组实现优先队列并排序数组——ADT实现
- hdu 1869 六度分离
- c语言的变量
- 邻居发现(Neighbor Discovery)协议
- vs+cocos2d-x 导入第三方库 移植到android
- 字符串Hash函数对比
- Java中类名,接口名与文件名
- 叶中泪的伤感日志:现实的残酷,让我心痛欲绝
- Ubuntu 12.10 发布