快速选择算法

2023-11-16

quick select 算法:

 

LintCode

5. 第k大元素

题目:在数组中找到第k大的元素

样例

给出数组 [9,3,2,4,8],第三大的元素是 4

给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推

 

Solution:

class Solution {
    /*
     * @param k : description of k
     * @param nums : array of nums
     * @return: description of return
     */
    public int kthLargestElement(int k, int[] nums) {
        // write your code here
        return quickSelect(nums, 0, nums.length - 1, k);
    }

    private int quickSelect(int[] nums, int left, int right, int k) {

    //选择一个值作为支点,最后结果输出int为支点所在的位置,如果位置等于k,输出,否则继续自身调用
        int pivot = nums[left];
        int i = left, j = right;
        while (i <= j) {
            //寻找左侧小于支点的元素
            while (i <= j && nums[i] > pivot) {
                i++;
            }
            //寻找右侧大于支点的元素
            while (i <= j && nums[j] < pivot) {
                j--;
            }
            //将选择出来的i或j与支点互换(此时支点为i或j,即前两个while中其中一个等于支点直接跳出)
            if (i <= j) {
                int tmp = nums[i];
                nums[i] = nums[j];
                nums[j] = tmp;
                i++;
                j--;
                //对应下方left~j,i~right
            }
        }

        //判断k的位置在支点的左或右,选择一部分执行
        if (left + k - 1 <= j) {
            return quickSelect(nums, left, j, k);
        }
        if (left + k - 1 >= i) {
            return quickSelect(nums, i, right, k - (i - left));
        }
        return nums[j + 1];
    }
}

(代码源自九章算法,注释自笔者)

快速选择算法与快速排序算法的区别在于,快速选择算法只会对支点的一侧进行排序,或者输出。

这种算法是不能有重复值的,因为每次都要与pivot交换,遇到与pivot相等的值会陷入死循环交换,故而这种方式不能用于快速排序。

快速排序:

public class QuickSortSolution {
    public void sortArr(int[] source) {
        sort(source,0,source.length-1);
    }

    private void sort(int[] nums, int left, int right) {
        if(left>=right)
            return;

        int i = left;//后面先+1,这个做pivot
        int j = right + 1;//因为后面要先+1
        //两个位置都超出范围1个位置

        int pivot = nums[left];

        while (true) {
            while(i+1<nums.length&&nums[++i]<pivot);
            while(j>=0&&nums[--j]>pivot);

            if(i>=j)
                break;
            else {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
            }

        }
        nums[left] = nums[j];
        nums[j] = pivot;
        //将j+1=i j寻找到比pivot小的置换为pivot
        //j指向pivot

        sort(nums,left,j-1);
        sort(nums,j+1,right);
    }

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速选择算法 的相关文章

随机推荐

  • CAP和BASE

    CAP概念 Consistency 一致性 所有节点在同一时间具有相同的数据 Availability 可用性 保证每个请求不管成功或者失败都有响应 Partition Tolerance 分区容错性 系统中任意信息的丢失或失败不会影响系统
  • vue打包后,网页打开是空白页的解决办法

    在config文件夹下的index js中 找到 assetsPublicPath 然后改成 assetsPublicPath build Template for index html index path resolve dirname
  • 安装FTP服务器

    环境 CentOS Linux release 7 9 2009 Core 安装 yum install y vsftpd 配置文件 cd etc vsftpd etc vsftpd vsftpd conf 主配置文件 核心配置文件 etc
  • vue (一) ---- vue介绍,数据双向绑定,指令学习

    一 vue介绍 1 渐进式js框架 1 渐进式 全家桶 vue 小项目 vue touter 页面越来越多 vuex 管理复杂的数据 2 框架 库 Lib 库就是一系列函数的集合 想完成什么就调用库中的某个方法 如 jquery 说明 开发
  • C语言经典100例题(32)--Press any key to change color(按任意键改变颜色)

    目录 题目 问题分析 代码 运行结果 题目 Press any key to change color 按任意键改变颜色 问题分析 在VS 2019编译器中没有textbackground这个库函数 所以需要手动写一个具有同样功能的函数 我
  • 关于 QDebug 左移操作符重载

    从创建了一个自定义类型开始吧 struct Point Point int x int y x x y y int x int y 如果我们想让其配合QDebug工作 需要重载左移操作符 流操作符 QDebug operator lt lt
  • conda环境切换清华源下载。安装opencv问题和conda常用命令

    Windows系统命令行中使用如下命令即可添加清华源 conda config add channels https mirrors tuna tsinghua edu cn anaconda pkgs free conda config
  • TEXLIVE安装失败卡住问题解决

    Installing to C texlive 2021 Installing 0001 4151 time total texlive infra 424k Installing 0002 4151 time total 00 01 02
  • LVGL学习(4):输入设备的四种类型及物理按键的实现

    在有一些场合中 如野外情况 可能我们会选择使用物理按键来控制LVGL 而不是使用触摸屏 所以本篇文章就以物理键盘为例来介绍一下如何自定义输入设备与LVGL进行交互 文章目录 1 输入设备类型 2 物理键盘实现 2 1 输入设备驱动注册 2
  • java.net.SocketTimeoutException: Read timed out 问题解决

    问题描述 今天开发时发现 jdbc hive 连接执行 一个 hive sql 查询语句时 总是报org apache thrift transport TTransportException java net SocketTimeoutE
  • crmeb5.0修改会员价格展示条件

    api components 组件目录 components goodList index vue 商品展示组件 components productWindow index vue 产品属性组件 components shareRedPa
  • 软件系统架构有哪几种?

    互联网飞速发展的当下 有一种极其重要的门类也随之应运而生 那就是软件工程 而软件工程中 又有非常重要的一环 那就是软件架构 这也是各个互联网公司无论大小都必备的一个系统基础 那么什么是软件架构呢 事实上 架构在软件发明时的 N 多年以前 就
  • Java导入xml文件

    需求 前后端分离项目 后端Springboot框架 将学生信息通过xml文件格式导入 一个学生信息 以及该学生选择的学科 student xml文件格式如下 StudentController java PostMapping import
  • 逆向爬虫27 sojson反调加密

    逆向爬虫27 sojson反调加密 目标 掌握sojson的加密的特点和原理 使用静态文件替换sojson反调 一 sojson加密特点和原理 sojson是一种常用的js反调和加密手段 在学习如何处理它之前 我们需要先了解它的特点和原理
  • LightGBM参数介绍

    Xgboost和LightGBM部分参数对照 Xgboots LightGbm booster default gbtree boosting default gbdt eta default 0 3 learning rate defau
  • python 提示 keyError 的4种解决方法

    https blog csdn net u011089523 article details 72887163 在读取dict的key和value时 如果key不存在 就会触发KeyError错误 如 Python t a 1 b 2 c
  • SSD-Pytorch训练自己的VOC数据集&遇到的问题及解决办法

    SSD 训练 data init py data config py data voc0712 py layers modules multibox loss py ssd py train py 预训练文件vgg16 reducedfc
  • ‘settings.xml‘ has syntax errors 解决办法

    settings xml has syntax errors 解决办法 文章目录 settings xml has syntax errors 解决办法 参考链接 又是一个小知识点 pom xml中的
  • 基于pwntools编写pwn代码

    目录 预备知识 pwn pwntools 实验目的 实验环境 实验步骤一 1 Pwntools安装及模块 已装 2 常用模块详细介绍 实验步骤二 实验步骤三 预备知识 pwn Pwn 是一个黑客语法的俚语词 是指攻破设备或者系统 发音类似
  • 快速选择算法

    quick select 算法 LintCode 5 第k大元素 题目 在数组中找到第k大的元素 样例 给出数组 9 3 2 4 8 第三大的元素是 4 给出数组 1 2 3 4 5 第一大的元素是 5 第二大的元素是 4 第三大的元素是