13:堆结构heap (priority queue)重要结构:上移过程heapInsert()


13:堆结构heap (priority queue)重要结构

         之

      上移过程heapInsert()

 

1、堆结构就是用数组实现的完全二叉树结构;

2、完全二叉树中如果每棵树(包括子数) 的最大值都在顶部 是 大根堆;

3、完全二叉树中如果每棵树(包括子数) 的最小值都在顶部 是 小根堆;

4、堆结构的heapInsert  与 heapify操作;

5、堆结构的增大和减少;

6、优先级队列结构,就是堆结构;

 

完全二叉树的概念:

  如果一棵树是满的,是完全二叉树;

  如果一棵树不是满的,处在变慢的路上,从左往右依次变满的数;

       都是完全二叉树。

 

落地:使用连续数组来表示对应的完全二叉树,下标的表示。

 

                                           i的父节点(i-1)/2

                                               任何i位置

              左孩子的位置2*i+1                      右孩子的位置2*i+2     

 

 堆:1、是完全二叉树

  2、是大根堆还是小根堆

   所以在数组中每次加入一个数,这个数会跟它的父进行比较,按照大小根堆的要求进行是否交换heapInsert()。

 

 1 // 新加进来的数,现在停在了index位置,请依次往上移动,
 2         // 移动到0位置,或者干不掉自己的父亲了,停!
 3         private void heapInsert(int[] arr, int index) {
 4             // [index] [index-1]/2
 5             // index == 0
 6             while (arr[index] > arr[(index - 1) / 2]) {
 7                 swap(arr, index, (index - 1) / 2);
 8                 index = (index - 1) / 2;
 9             }
10         }