欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第六章 堆排序 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