zoukankan      html  css  js  c++  java
  • 堆+建堆、插入、删除、排序+java实现

    package testpackage;
    
    import java.util.Arrays;
    
    public class Heap {
            //建立大顶堆
            public static void buildMaxHeap(int[] a) {
                for(int i=(a.length/2)-1;i>=0;i--) {
                    adjustDown(a,i,a.length);
                }
            }
            //向下调整
            public static void adjustDown(int[] a,int i,int len) {
                int temp,j;
                temp=a[i];
                for(j=2*i+1;j<len;j=2*j+1) {       //j为当前i的子节点,默认为左节点
                    if(j+1<len&&a[j+1]>a[j])       //如果右节点大,则选右节点
                        j++;
                    if(a[j]<=temp)                 //若子节点都比初始值temp小,说明找到了位置
                        break;
                    else {                           
                        a[i]=a[j];                   //如果没有终止,那么将子节点中数值大的上调至i处    
                        i=j;                       //同时i下降到j这个位置
                    }
                }
                a[i]=temp;                           //将temp放在最终的位置
            }
            //堆排序
            public static void heapSort(int[] a) {
                buildMaxHeap(a);
                for(int i=a.length-1;i>=0;i--) {
                    int temp=a[0];
                    a[0]=a[i];
                    a[i]=temp;
                    adjustDown(a,0,i);  //将剩余len-1调整为大顶堆,循环,所以用i表示
                }
            }
            //向上浮动
            public static void adjustUp(int[] a,int i) {
                int temp,j;
                temp=a[i];
                j=(i-1)/2;
                while(j>=0&&a[j]<temp) {
                    a[i]=a[j];
                    i=j;
                    j=(j-1)/2;
                }
                a[i]=temp;
            }
            //插入
            public static int[] insert(int[] a,int num) {
                int[] b=new int[a.length+1];
                int i,j;
                i=0;
                j=0;
                while(i<a.length) b[j++]=a[i++];
                b[a.length]=num;
                adjustUp(b,a.length);
                return b;
            }
            //删除(删除时有规则的,堆顶元素才会被删除)
            public static int[] delete(int[] a) {
                int temp=a[0];
                a[0]=a[a.length-1];
                a[a.length-1]=temp;
                adjustDown(a,0,a.length-1);
                int[] b=new int[a.length-1];
                int i,j;
                i=j=0;
                while(i<a.length-1) b[j++]=a[i++];
                return b;
                
            }
            public static void main(String[] args) {
                int[] a= {5,88,45,37,91,26,13,66,50};
                buildMaxHeap(a);       //建堆
                System.out.println(Arrays.toString(a));
                a=insert(a,77);           //插入
                System.out.println(Arrays.toString(a));
                a=delete(a);           //删除,只能删除堆顶元素
                System.out.println(Arrays.toString(a));
                heapSort(a);          //排序
                System.out.println(Arrays.toString(a));
            }
    }
  • 相关阅读:
    zoj 2316 Matrix Multiplication 解题报告
    BestCoder7 1001 Little Pony and Permutation(hdu 4985) 解题报告
    codeforces 463C. Gargari and Bishops 解题报告
    codeforces 463B Caisa and Pylons 解题报告
    codeforces 463A Caisa and Sugar 解题报告
    CSS3新的字体尺寸单位rem
    CSS中文字体对照表
    引用外部CSS的link和import方式的分析与比较
    CSS样式表引用方式
    10个CSS简写/优化技巧
  • 原文地址:https://www.cnblogs.com/heyboom/p/8987354.html
Copyright © 2011-2022 走看看