找出第k大的数

用容量为k的最小堆实现:

/*
 *
 * @Time : 12/24/2018 20:34
 * @Author : Zhang, Chen (chansonzhang)
 * @Email : ZhangChen.Shaanxi@gmail.com
 * @FileName: MinHeap.java
 */
public class MinHeap {
    private int[] elements;
    private int heapSize;

    public int[] getElements() {
        return elements;
    }

    public MinHeap(int heapSize) {
        this.heapSize = heapSize;
        elements = new int[heapSize];
    }

    public int insert(int x) {
        if (x <= elements[0]) {
            return -1; //insert failure
        }
        elements[0] = x;
        return adjustDown(0);
    }

    public int adjustDown(int currentIndex) {
        int leftIndex = leftChildIndex(currentIndex);
        int rightIndex = rightChildIndex(currentIndex);
        int minElementIndex = currentIndex;
        if (leftIndex < this.heapSize && elements[leftIndex] < elements[minElementIndex])
            minElementIndex = leftIndex;
        if (rightIndex < this.heapSize && elements[rightIndex] < elements[minElementIndex]) {
            minElementIndex = rightIndex;
        }

        if (minElementIndex != currentIndex) {
            swap(currentIndex, minElementIndex);
            return adjustDown(minElementIndex);
        } else {
            return currentIndex;
        }
    }

    private int leftChildIndex(int i) {
        return 2 * i + 1;
    }

    private int rightChildIndex(int i) {
        return 2 * i + 2;
    }

    private void swap(int i, int j) {
        int tmp = elements[i];
        elements[i] = elements[j];
        elements[j] = tmp;
    }

    public static void main(String[] args){
        int[] a={0,1,2,3,5,6,4,9,7,8};
        int k=3;
        MinHeap minHeap=new MinHeap(3);
        for(int x:a){
            minHeap.insert(x);
        }
        System.out.println("The max k numbers:");
        for(int x:minHeap.getElements()){
            System.out.print(x+" ");
        }
        System.out.println("\nThe k-th largest Number "+minHeap.getElements()[0]);

    }
}

输出如下:

The max k numbers:
7 8 9 
The k-th largest Number 7
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值