栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间:发布时间: 百科书网 趣学号
Java实现大顶堆和小顶堆

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

//重写Comparator方法
//通过返回y - x和x - y来返回大顶堆和小顶堆
Comparator cmp = new Comparator(){
				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 A,B;
    
    public MedianFinder() {
        //小顶堆
        A = new PriorityQueue<>();
        //大顶堆
        //B = new PriorityQueue<>((x,y)->(y-x));
        B = new PriorityQueue<>(new Comparator(){
            @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);
    }
}


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);
    }
}
转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/276304.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号