天天看点

数据结构之堆Java实现

数据结构之堆

堆是什么?堆是一种特殊的完全二叉树,就像下面这棵树一样

数据结构之堆Java实现

最小堆的特点:所有父节点的值都比子节点要小!相反

最大堆得特点:所有父节点的值都比子节点要大!

如何构造堆呢?

99,5,36,7,22,17,46,12,2,19,25,28,1,92 对于这样一串数字来说,首先建立一个数组a,长度为15,(a[0]不存数字,从下标1开始)

首先所有的叶子节点都是满足最小堆的条件的,因为他们没有子节点,因此应该从n/2开始(n为数字的个数,而不是数组的长度,这里等于14),判断是否满足堆得性质,如果不满足,则调整,Java代码如下:

public class Heap {
      public static void main(String[] args) {
          int[] a=new int[]{,,,,,,,,,,,,,,};
          for(int i=/;i>=;i--)
              topToDown(a, i);
         for(int i=;i<a.length;i++)
             System.out.print(a[i]+" ");
    }
      public static void topToDown(int[] a,int index){
          if(index>=a.length||*index>=a.length) return ;
          if(*index+>=a.length){
              if(a[index]<a[*index])
                  return ;
              else{
                  int temp=a[*index];
                  a[*index]=a[index];
                  a[index]=temp;
                  topToDown(a, *index);
              }
          }else{
              if(a[index]<a[*index]&&a[index]<a[*index+])
                  return ;
              else{
                  int temp;
                  if(a[*index]>a[*index+]){
                      temp=a[*index+];
                      a[*index+]=a[index];
                      a[index]=temp;
                      topToDown(a, *index+);
                  }else{
                      temp=a[*index];
                      a[*index]=a[index];
                      a[index]=temp;
                      topToDown(a, *index);
                  }
              }
          }
      }
}
           

如何利用堆呢?

堆可以用来求最大最小值,也可以排序数组,下面举个例子

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

求最小的K个数,解题过程如下:利用数组的前K个数构造一个堆,并且维护成为最大堆,然后遍历数组的第k+1个数,如果比堆顶元素大,则丢弃,继续遍历k+2个数,如果比堆顶元素小,则将堆顶元素置换为这个数,并且维护堆的性质,再遍历k+2个数。这样依次这样依次下去,当数组遍历完的时候,堆中的元素就是最小的K个数!

Java代码实现如下

public class Heap {
      public static void main(String[] args) {
          int[] a=new int[]{,,,,,,,};
          int[] heap=new int[];
          for(int i=;i<;i++){
              heap[i+]=a[i];
          }
          for(int i=/;i>=;i--)
              maxHeap(heap, i);
          for(int i=;i<a.length;i++){
              if(a[i]<heap[]){
                  heap[]=a[i];
                  maxHeap(heap, );
              }
          }
          for(int i=;i<heap.length;i++)
              System.out.print(heap[i]+" ");
    }
      public static void maxHeap(int[] heap,int index){
          if(index>=heap.length||*index>=heap.length) return ;
          if(*index+>=heap.length){
              if(heap[index]<heap[*index]){
                  int temp=heap[*index];
                  heap[*index]=heap[index];
                  heap[index]=temp;
                  maxHeap(heap, *index);
              }else{
                  return ;
              }
          }else{
              if(heap[index]>heap[*index]&&heap[index]>heap[*index+])
                  return ;
              else{
                  int temp;
                  if(heap[*index]>heap[*index+]){
                      temp=heap[*index];
                      heap[*index]=heap[index];
                      heap[index]=temp;
                      maxHeap(heap, *index);
                  }else{
                      temp=heap[*index+];
                      heap[*index+]=heap[index];
                      heap[index]=temp;
                      maxHeap(heap, *index+);
                  }
              }
          }
      }
}
           

继续阅读