• 第六章 堆排序 6.5 优先队列


    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));
        }
    }

  • 相关阅读:
    去除空格
    常见的Js
    无法访问 ASP 兼容性模式
    asp.net mvc 笔记一
    PowerDesigner如何将设计的表更新到数据库中
    微信小程序基于第三方websocket的服务器端部署
    C# Linq GroupBy 分组过滤求和
    一步一步教你用c# entity framework6 连接 sqlite 实现增删改查
    执行指定iframe页面的脚本
    vs2017 x64 ibatis.net 平台调用 Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342 x64
  • 原文地址:https://www.cnblogs.com/xiaojintao/p/3779762.html
Copyright © 2020-2023  润新知