• 堆+建堆、插入、删除、排序+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));
            }
    }
  • 相关阅读:
    linux samba 配置
    实例解读 linux 网卡驱动
    Linux操作系统的安全管理设置
    找回Linux/Unix下各系统的密码
    CF441E Valera and Number
    CF1175F The Number of Subpermutations 题解
    CF1553 比赛记录
    P5618 [SDOI2015]道路修建 题解
    CF 1530 比赛记录
    AT2063 [AGC005E] Sugigma: The Showdown 题解
  • 原文地址:https://www.cnblogs.com/heyboom/p/8987354.html
Copyright © 2020-2023  润新知