《漫画算法2》源码整理-7 第K大的数字

Posted GarfieldEr007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《漫画算法2》源码整理-7 第K大的数字相关的知识,希望对你有一定的参考价值。

第K大的数字

public class KthLargestNumber 
    /**
     * 寻找第k大的元素
     * @param array  待调整的堆
     * @param k  第几大
     */
    public static int findKthLargestNumber(int[] array, int k) 
        //1.用前k个元素构建最小堆
        buildHeap(array, k);
        //2.继续遍历数组,和堆顶比较
        for (int i = k; i < array.length; i++) 
            if (array[i] > array[0]) 
                array[0] = array[i];

                downAdjust(array, 0, k);
            
        
        //3.返回堆顶元素
        return array[0];
    

    /**
     * 构建堆
     * @param array  待调整的堆
     * @param length  堆的有效大小
     */
    private static void buildHeap(int[] array, int length) 
        // 从最后一个非叶子结点开始,依次下沉调整
        for (int i = (length - 2) / 2; i >= 0; i--) 
            downAdjust(array, i, length);
        
    

    /**
     * 下沉调整
     * @param array     待调整的堆
     * @param index    要下沉的结点
     * @param length    堆的有效大小
     */
    private static void downAdjust(int[] array, int index, int length) 
        // temp保存父结点值,用于最后的赋值
        int temp = array[index];
        int childIndex = (2 * index) + 1;

        while (childIndex < length) 
            // 如果有右孩子,且右孩子小于左孩子的值,则定位到右孩子
            if (((childIndex + 1) < length) &&
                    (array[childIndex + 1] < array[childIndex])) 
                childIndex++;
            
            // 如果父结点小于任何一个孩子的值,直接跳出
            if (temp <= array[childIndex]) 

                break;
            
            //无需真正交换,单向赋值即可
            array[index] = array[childIndex];
            index = childIndex;
            childIndex = (2 * childIndex) + 1;
        

        array[index] = temp;
    

    public static void main(String[] args) 
        int[] array = new int[]  7, 5, 15, 3, 17, 2, 20, 24, 1, 9, 12, 8 ;
        System.out.println(findKthLargestNumber(array, 5));
    

以上是关于《漫画算法2》源码整理-7 第K大的数字的主要内容,如果未能解决你的问题,请参考以下文章

《漫画算法》源码整理-7

《漫画算法2》源码整理-2 图算法

《漫画算法2》源码整理-9 股票交易最大收益

《漫画算法2》源码整理-1 二分查找树 AVL树 红黑树

《漫画算法》源码整理-4 大顶堆 小顶堆 优先队列

《漫画算法》源码整理-5 排序算法