Java 取数组中第n大的元素

本文介绍了如何使用Java有效地找到数组中第n大的元素。通过遍历、排序以及利用快速排序的思想,可以将算法复杂度降低到O(n),其中详细解释了快速排序在解决此类问题时的策略,即找到基准元素并逐步缩小搜索范围。
摘要由CSDN通过智能技术生成

遍历:算法复杂度O(n)。

对数组进行排序,直接索引到第n大的元素。算法复杂度O(nlogn)。

这里利用快速排序来解决此问题:O(n)

思路:首先找到一个元素,将它移到合适的位置,如果该元素为4,且要找第四名的元素是什么,此时就不需要考虑前面的元素了。

如果要找第6名的元素,此时就从4这个位置开始找第2名的元素,接着再进行分组,然后求出左边组中的第2名元素,依次类推。

 = O(2n)  = O(n)。

import java.util.*;

public class Selection {

    // 对arr[l...r]部分进行partition操作
    // 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
    // partition 过程, 和快排的partition一样
    // 思考: 双路快排和三路快排的思想能不能用在selection算法中? :)
    private static int partition(Comparable[] arr, int l, int r){

        // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
        swap( arr, l , (int)(Math.random()*(r-l+1))+l );

     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值