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);
            }
            
        }
  • 相关阅读:
    hdu2795-Billboard(线段树应用好题)
    AC自动机模板
    kmp模板
    字符串Hash模板
    (可持久化)带修莫队的实现方法
    HZNU1544众数问题
    NOIP2006提高组第二题-金明的预算方案
    Python学习笔记
    (模板)唯一分解定理
    Java 7 源码学习系列(二)——Enum
  • 原文地址:https://www.cnblogs.com/lijins/p/10153948.html
Copyright © 2011-2022 走看看