【剑指offer第17天】 排序(中等) 大顶堆小顶堆+手撕快排

Java实现大顶堆和小顶堆

实现数据结构采用java的优先队列,通过自定义排序方式来实现不同的堆

//重写Comparator方法
//通过返回y - x和x - y来返回大顶堆和小顶堆
Comparator<Integer> cmp = new Comparator<Integer>(){
				public int compare(Integer x,Integer y){
						//返回大顶堆
						return y - x;
						//返回小顶堆
						return x - y;
}
}

在这里插入图片描述
输出数据流中的中位数,A为小顶堆,B为大顶堆,存放的时候,如果为偶数先向A中存放,且A中存放的是较大的一半数,因此返回A.peek()正好是中位数。B中存放较小的一部分,然而为大顶堆因此返回B.peek()时返回的也刚好是右半部分中位数。

class MedianFinder {
    Queue<Integer> A,B;
    /** initialize your data structure here. */
    public MedianFinder() {
        //小顶堆
        A = new PriorityQueue<>();
        //大顶堆
        //B = new PriorityQueue<>((x,y)->(y-x));
        B = new PriorityQueue<>(new Comparator<Integer>(){
            @Override
            public int compare(Integer o1,Integer o2){
                return o2 - o1;
            }
        });
    }
    public void addNum(int num) {
        if(A.size()==B.size()){
            //如果N为偶数,向A中插入数据,先放入B中再向A插入 保证较大的放入A中
            B.add(num);
            A.add(B.poll());
        }else{
            A.add(num);
            B.add(A.poll());
        }
    }
    public double findMedian() {
        return A.size()!=B.size()?A.peek():((A.peek()+B.peek())/2.0);
    }
}

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */

在这里插入图片描述

class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        quickSort(arr,0,arr.length-1);
        return Arrays.copyOf(arr,k);
    }
    void quickSort(int[] arr,int left,int right){
        if(left >= right){return;}
        int i = left,j = right;
        int pivot = arr[left];
        while(i < j){
            //快速排序先进行j--操作 再找i的位置
            while(i < j&&arr[j] >= arr[left])j--;
            while(i < j&&arr[i] <= arr[left])i++;
            if(i < j){
                //找到交换的数值 三元交换法则进行两个数值之间的交换
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
        //将当前寻找到的数改为哨兵的值  将left的值改为i的值 并且对i的值进行更新操作
        arr[left] = arr[i];
        arr[i] = pivot;
        quickSort(arr,left,i-1);
        quickSort(arr,i+1,right);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值