堆+建堆插入删除排序+java实现

Posted 嘿boom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆+建堆插入删除排序+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));
        }
}

 

以上是关于堆+建堆插入删除排序+java实现的主要内容,如果未能解决你的问题,请参考以下文章

c++ 手写堆 (包括建堆排序添加元素删除元素)

数据结构图解七大排序

Java集合与数据结构——七大排序算法的实现

堆排序

数据结构:堆 的详解

堆排序和TOP-K问题