【搞定算法】BFPRT 算法、快排解决第 k 大数问题

博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java  一起交流秋招面试经验。

目  录:

方法1:暴力解法

方法2:快排实现【笔试版+面试版】

方法3:BFPRT 算法实现【面试优化版】


问题:求一个数组中的第 k 小 / 大的数。

说明:这道题求解不难,主要的目的是为了引出 快排算法的应用(partiotion)和 BFPRT 算法

方法1:暴力解法

 其实我们很容易想到先将这个数组排好序,再直接取出数组中下标为 k - 1 的数即可。

public class FindKthNumByQuickSort {

    // 暴力解法
    public static int getKthNum(int[] arr, int k){
        if(arr == null || arr.length < 1 || k < 0){
            return Integer.MIN_VALUE;
        }

        Arrays.sort(arr);
        return arr[k - 1];
    }
}

方法2:快排实现【笔试版+面试版】

快速排序将比关键字大的元素从前面移动到后面,比关键字小的元素从后面直接移动到前面,从而减少了总的比较次数和移动次数,同时采用”分而治之“的思想,把大的拆分为小的,小的再拆分为更小的,其原理如下:通过一趟排序将待排序的数组分成两个部分,其中一部分记录的是比关键字更小的,另一部分是比关键字更大的,然后再分别对着两部分继续进行排序,直到整个序列有序;

步骤:代码也很容易理解,其实就是一个“填坑”的过程,

1、第一个“坑”挖在每次排序的第一个位置 arr[low],从序列后面往前找第一个比 pivot 小的数来把这个“坑”填上,这时候的“坑”就变成了当前的 arr[high];

2、然后再从序列前面往后用第一个比 pivot 大的数把刚才的“坑”填上;

3、如此往复,始终有一个“坑”需要我们填上,直到最后一个“坑”出现,这个“坑”使用一开始的 piv

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值