第六章 堆排序 6.5 优先队列
程序员文章站
2022-05-23 09:58:17
...
package chap06_Heap_Sort;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import org.junit.Test;
/**
* 优先队列,二叉堆数组实现,数组的size最好大一些,至少比里面的堆大一些,来实现堆的扩展(插入元素)
*
* @author xiaojintao
*
*/
public class PriorityQueue {
/**
* 返回当前下标下父节点的下标
*
* @param i
* @return
*/
protected static int parent(int i) {
if (i == 0)
return i;
return (i - 1) / 2;
}
/**
*
* @param i
* @return
*/
protected static int left(int i) {
return 2 * i + 1;
}
/**
*
* @param i
* @return
*/
protected static int right(int i) {
return 2 * (i + 1);
}
/**
* 重建最大堆,从i开始到size(不包含size索引),size为堆的大小
*
* @param a
* @param i
* @param size
*/
protected static void maxHeapify(int[] a, int i, int heapsize) {
int l = left(i);
int r = right(i);
int tmp;
while (l < heapsize & r < heapsize) {
if (a[i] >= a[l] & a[i] >= a[r])
return;
else if (a[l] > a[r]) {
tmp = a[i];
a[i] = a[l];
a[l] = tmp;
i = l;
} else {
tmp = a[i];
a[i] = a[r];
a[r] = tmp;
i = r;
}
l = left(i);
r = right(i);
}
if (l < heapsize) {
if (a[i] < a[l]) {
tmp = a[i];
a[i] = a[l];
a[l] = tmp;
i = l;
}
}
return;
}
/**
*
* @param a
* @return
*/
static int heapMaximum(int[] a) {
return a[0];
}
/**
*
* @param a
* @param heapsize
* @return
*/
static int heapExtractMax(int[] a, int heapsize) {
if (heapsize < 1)
return -1;
int max = a[0];
a[0] = a[heapsize];
heapsize--;
maxHeapify(a, 0, heapsize);
return -1;
}
/**
* 将数组a转换成最大堆,不要用递归方法,尽量用迭代方法实现
*
* @param a
*/
protected static void buildMaxHeap(int[] a) {
int n = a.length;
for (int i = n / 2; i >= 0; i--) {
maxHeapify(a, i, n);
}
}
/**
* 将堆上x位置处的值增加为key
*
* @param a
* @param x
* @param key
*/
static void heapIncreaseKey(int[] a, int x, int key) {
a[x] = key;
if (x == 0)
return;
int i;
int tmp;
do {
i = parent(x);
if (a[i] >= a[x])
break;
else {
tmp = a[i];
a[i] = a[x];
a[x] = tmp;
x = i;
}
} while (i != 0);
}
/**
* 向堆中插入元素,size为当前堆的尺寸,插入后,空位置处为int的最小值,min_value
*
* @param n
* @param size
* @param key
*/
static void maxHeapInsert(int[] n, int key, int heapsize) {
if (heapsize == n.length)
System.err.println("heap is full");
heapsize++;
n[heapsize-1] = key;
buildMaxHeap(n);
}
@Test
public void testName() throws Exception {
int[] a = { 2, 5, 3, 7, 8, 12, 0, 2, 45, 32 };
int[] a1 = new int[12];
for (int i = 0; i < a1.length; i++) {
if (i < a.length)
a1[i] = a[i];
else
a1[i] = Integer.MIN_VALUE;
}
System.out.println(Arrays.toString(a1));
// heapIncreaseKey(a, 3, 50);
maxHeapInsert(a1, 65, 10);
System.out.println(Arrays.toString(a1));
}
}
转载于:https://my.oschina.net/xiaojintao/blog/817357
上一篇: 第六章