zoukankan      html  css  js  c++  java
  • 最大堆,堆排序

    1: 怎样形成一个大根堆呢?

        /*
         * heapInsert  将新进来的节点  更新到原来的大堆中。
         * index 节点大于她的父节点 就往上交换, 可能 一直到最大堆的根。
         */
        
        public static void heapInsert(int[] arr, int index){
            while( arr[index] > arr[(index-1)/2]){
                swap(arr, index, (index-1)/2);
                index = (index-1)/2;
            }
        }

    2:当大根堆中某个节点的值变小了,怎么办?

    /*
         * 当最大堆中的某个节点变小了,需要和他的左右孩子比较, 有需要的话要往下沉。
         */
        public static void heapify(int[] arr, int index, int heapsize){
            
            int left = index*2 + 1;
            while( left < heapsize ){
                int largest = left +1 < heapsize && arr[left+1] > arr[left] ? left+1:left;
                largest = arr[index] > arr[largest] ? index:largest;
                
                if( largest == index )
                    break;
                swap(arr, largest, index);
                index = largest;
                left = index*2+1;
            }
        }

    3:堆排序的过程是怎么样的?

    public static void heapSort(int[] arr){
            
            for( int i=0; i<arr.length; ++i)
                HeapSort.heapInsert(arr, i);
            
            int heapsize = arr.length;
            
            while( heapsize > 0 ){
                swap(arr, 0, --heapsize);
                heapify(arr, 0, heapsize);
            }
            
        }
  • 相关阅读:
    Codeforces 1149 B
    Tenka1 Programmer Contest 2019 D
    BZOJ 1001 [BeiJing2006]狼抓兔子
    Codeforces 741 D
    HDU 5306 Gorgeous Sequence
    HDU 6521 Party
    Codeforces 912A/B
    Educational Codeforces Round 35 B/C/D
    Codeforces 902D/901B
    Codeforces 902B
  • 原文地址:https://www.cnblogs.com/lijins/p/10153948.html
Copyright © 2011-2022 走看看