快速排序+快速选择(常用于筛选前N个最大or最小)-java实现

本文介绍了Java实现快速排序和快速选择的方法,适用于筛选前N个最大或最小元素。作者强调了复习基础知识的重要性,并提供了代码示例供读者实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序+快速选择(常用于筛选前N个最大or最小)-java实现

最近这一两天,终于有空复习以前学习的东西了。前面忙着学SpringCloud和Netty感觉花费了太多时间,做项目也是。后来实习的面试准备就等于没准备,全靠着以前学习的记忆面试。果不其然,效果不是很好。
这里建议大家做项目量力而行,最好还是多学习和复习所学的知识。毕竟别人往往一两句话就认定了你的项目的水准和花费的努力。而复习所学的知识,反而才更适合现在的环境。

吐槽完毕,最近终于有时间做题了,重新复习了下快排。(毕竟用了很多次,所以写一写,当作复习了)

下面是java版本的快速排序快速选择

public Test{
   
    @Test
    public void testSort() {
   

        // 选择前11小的数字
        int[] arr1 = {
   10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1};
        quickTopN(arr1, true, 0, arr1.length - 1, 10);
        System.out.println("选择前11小的数字");
        for (int item : arr1) {
   
            System.out.printf("%d ", item);
        }
        System.out.println();


        // 选择前11大的数字
        int[] arr2 = {
   1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,
### Java 中优先级队列 `PriorityQueue` 的使用与实现 #### 1. 基础概念 Java 中的 `PriorityQueue` 是一种基于堆数据结构实现的数据容器,其内部维护了一个二叉堆来保证元素按优先级排序。默认情况下,`PriorityQueue` 实现的是最小堆(min-heap),即每次取出的都是当队列中最小的元素[^3]。 #### 2. 创建 `PriorityQueue` 可以通过多种方式创建 `PriorityQueue` 对象: - **无参数构造函数** 使用默认初始容量和自然顺序创建一个空的优先级队列。 ```java PriorityQueue<Integer> pq = new PriorityQueue<>(); ``` - **指定初始容量** 可以为优先级队列设置初始容量以优化性能。 ```java PriorityQueue<Integer> pqWithCapacity = new PriorityQueue<>(20); ``` - **自定义比较器** 如果需要改变默认的排序规则,则可以传入一个自定义的比较器对象。 ```java PriorityQueue<Integer> pqWithComparator = new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); // 改变成最大堆 } }); ``` 上述方法展示了如何通过不同的构造函数初始化 `PriorityQueue`[^1]。 #### 3. 主要操作方法 以下是 `PriorityQueue` 提供的一些用方法及其功能说明: - **add(E e)** 或者 **offer(E e)**:向队列中插入新元素并调整堆结构使其保持有序状态。 - **poll()**:移除并返回队首元素(具有最高优先权的那个)。如果队列为空则返回 null。 - **peek()**:获取但不删除队首元素;若队列为空也返回 null。 - **size()** 和 **isEmpty()**:分别用于查询队列大小以及判断是否为空。 下面是一个简单的例子展示这些基本操作: ```java import java.util.PriorityQueue; public class Main { public static void main(String[] args) { PriorityQueue<String> priorityQueue = new PriorityQueue<>(); // 添加元素到队列 priorityQueue.add("Banana"); priorityQueue.offer("Apple"); System.out.println("Peek at the head element: " + priorityQueue.peek()); while (!priorityQueue.isEmpty()) { System.out.println(priorityQueue.poll()); // 输出 Apple -> Banana } } } ``` 此代码片段演示了如何向 `PriorityQueue` 插入字符串类型的项目,并查看它们被提取出来的顺序遵循字母表升序排列[^2]。 #### 4. 底层实现原理 `PriorityQueue` 内部采用数组形式存储节点,并维持完全二叉树特性以便快速定位父结点及子结点位置关系。每当有新的项加入或者已有顶点被弹出之后都会触发一次向上/向下筛选过程 (sift-up or sift-down),从而重新恢复整个集合满足堆属性的要求——对于每一个非叶子节点而言,它的键值都不大于(小于等于)任何一个后代节点的关键字值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值