用java实现一个基于堆排序的优先队列
来源:互联网 发布:js dom编程艺术 源码 编辑:程序博客网 时间:2024/04/28 00:54
com.sunny.heap
public class MaxPQ<Key>{
public static void main(String[] args){
MaxPQ<String> heap = new MaxPQ<String>(11);
heap.insert("S");
heap.insert("R");
heap.insert("T");
while(!heap.isEmpty())
{
System.out.println(heap.delMax());
}
heap.show();
}
private key[] pq; // 基于堆的完全二叉树
private int N = 0; // 完全二叉树的大小
public MaxPQ(int max){
pq = (key[]) new Comparable[max+1];
}
public boolean isEmpty(){
return N == 0;
}
public void insert(key v){
pq[++N] = v;
swim(N);
}
public key delMax(){
key max = pq[1];
exch(1, N--);
pq[N+1] = null;
sink(1);
return max;
}
/**
* 比较数组qp中位于位置i和j的两个元素的大小
*/
private boolean less(int i, int j){
return pq[i].compareTo(pq[j]) < 0;
}
/**
* 交换数组pq中位置位于i和j的两个元素
*/
private void exch(int i, int j){
key temp = pq[i];
pq[i] = pq[j];
pq[j] = temp;
}
/**
* 由下至上的堆的有序化(上浮)
*/
private void swim(int k){
while (k > 1 && less(k/2, k)) {
exch(k/2, k);
k = k/2;
}
}
/**
* 由上至下的堆的有序化(下沉)
*/
private void sink(int k){
while (2*k <= N) {
int j = 2*k;
if (j < N && less(j, j+1)) {
j++;
}
if (less(j, k)) {
break;
}
exch(j, k);
k = j;
}
}
/**
* 打印数组a中的元素
*/
private void show(){
for(int i=0;i<pq.length;i++){
System.out.print(pq[i]+",");
}
}
}
public class MaxPQ<Key>{
public static void main(String[] args){
MaxPQ<String> heap = new MaxPQ<String>(11);
heap.insert("S");
heap.insert("R");
heap.insert("T");
while(!heap.isEmpty())
{
System.out.println(heap.delMax());
}
heap.show();
}
private key[] pq; // 基于堆的完全二叉树
private int N = 0; // 完全二叉树的大小
public MaxPQ(int max){
pq = (key[]) new Comparable[max+1];
}
public boolean isEmpty(){
return N == 0;
}
public void insert(key v){
pq[++N] = v;
swim(N);
}
public key delMax(){
key max = pq[1];
exch(1, N--);
pq[N+1] = null;
sink(1);
return max;
}
/**
* 比较数组qp中位于位置i和j的两个元素的大小
*/
private boolean less(int i, int j){
return pq[i].compareTo(pq[j]) < 0;
}
/**
* 交换数组pq中位置位于i和j的两个元素
*/
private void exch(int i, int j){
key temp = pq[i];
pq[i] = pq[j];
pq[j] = temp;
}
/**
* 由下至上的堆的有序化(上浮)
*/
private void swim(int k){
while (k > 1 && less(k/2, k)) {
exch(k/2, k);
k = k/2;
}
}
/**
* 由上至下的堆的有序化(下沉)
*/
private void sink(int k){
while (2*k <= N) {
int j = 2*k;
if (j < N && less(j, j+1)) {
j++;
}
if (less(j, k)) {
break;
}
exch(j, k);
k = j;
}
}
/**
* 打印数组a中的元素
*/
private void show(){
for(int i=0;i<pq.length;i++){
System.out.print(pq[i]+",");
}
}
}
阅读全文
0 0
- 用java实现一个基于堆排序的优先队列
- 基于二叉堆实现的优先队列和堆排序
- 堆的实现、堆排序、优先队列
- 数据结构与算法-堆、基于堆实现的优先队列、堆排序
- 基于堆的优先队列的实现
- 基于堆的优先队列实现
- 基于堆的优先队列和堆排序
- 基于堆的优先队列及堆排序
- 堆排序,优先队列实现
- 算法设计之,堆,堆排序,基于最大堆的最大优先队列的实现(C++实现)
- 算法导论&堆排序&堆实现的优先队列
- 基于堆的优先队列
- 基于堆的优先队列
- 基于堆的优先队列
- 基于堆的优先队列
- 利用堆实现堆排序&优先队列
- 利用堆实现堆排序&优先队列
- 优先队列(二叉堆实现) + 堆排序
- 2017-10-27周测试题
- 今天看到新闻说多久换手机
- ReentrantLock实现原理分析
- 现代都市女性所爱的潮流搭!
- 论文解析之Image Restoration Using Very Deep Convolutional Encoder-Decoder Networks with Symmetric Skip Co
- 用java实现一个基于堆排序的优先队列
- 用户和用户组管理、密码和用户配置文件
- 使用MediaProjection和MediaRecorder实现屏幕录制
- 欢迎使用CSDN-markdown编辑器
- Jzoj4840 小W砍大树
- Go程序结构
- IOS 参考学习
- 卡诺模型(用户需求分析模型)
- MATLAB学习之函数