最大堆,堆排序

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);
        }
        
    }
原文地址:https://www.cnblogs.com/lijins/p/10153948.html