N个数中的第k个最大值

2023-05-16

 确定一组N个数中的第k个最大值,这是数据结构和算法分析(java语言描述)中讨论的第一个问题。书中第一章也已给处两种常规思路:

1-先将N个数的数组整体进行递减排序,然后返回位置k(数组索引为k-1)上的元素。
2 - 先将N个数的前k个数读入到数组,并将数组递减排序。然后将剩下的元素逐个读入。新元素读取时,如果小于数组中第k个元素则忽略,否则就放入到正确的位置,同时数组中最后一个元素被挤出数组。算法结束时,位于数组的第k个元素就是需要返回的答案。

实现方案1:

 编写一个方法,实现对传入数组的递减排序并返回第k个值

// 方法1 整体冒泡排序 然后直接返回第K个最大值
    public static int sortAndReturn(int k, int[] arr) {

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - 1; j++) {
                if (arr[j] < arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        return arr[k - 1];
    }

在main方法中对已有数组测试:

public static void main(String[] args) {

        int[] arr = { 12, 23, 34, 45, 53, 98, 6, 68, 17, 80, 18, 29, 83, 59, 40 };

        // 采用方法1,输出数组arr中第十个最大值
        System.out.println(sortAndReturn(10, arr));
    }

程序输出为29,排序后的数组为98 83 80 68 59 53 45 40 34 29 23 18 17 12 6 (可以在sortAndReturn方法中对已排序数组遍历输出观察),上面第十个最大值也为29,正确。

实现方案2:

先读入前K个元素到数组并递减排序,再用后面的新元素与数组元素对比根据比较结果将新元素放入数组中正确的位置或舍弃,算法结束时返回位置K上的元素

    public static int readInAndReturn(int k, int[] arr) {

        // K个元素的新数组
        int[] newArr = new int[k];

        for (int i = 0; i < newArr.length; i++) {
            newArr[i] = arr[i];
        }
        // 选择排序实现新数组newArr的递减排序
        for (int i = 0; i < newArr.length; i++) {
            for (int j = i; j < newArr.length; j++) {
                if (newArr[i] < newArr[j]) {
                    int temp=newArr[i];
                    newArr[i]=newArr[j];
                    newArr[j]=temp;
                }
            }
        }
        //这里已经读取六个元素到新数组中,并完成了递减排序
        //读取后面的元素
        for (int i = k; i < arr.length; i++) {

            int newElement=arr[i];          

            // 新元素比newArr中的最小元素大才能进一步比较
            if (newElement > newArr[k - 1]) {

                for (int j = 0; j < newArr.length - 1; j++) {
        //如果新元素大小在两个元素之间  插入新元素,插入位置后的元素索引后移(元素位置后移1)
                    if (newArr[j] > newElement &&newElement > newArr[j + 1]) {

                        if (k>j+1) {
                    //数组j+1索引后面的后一个元素为前一个元素的值
                                newArr[m]=newArr[m-1];
                            }
                        }
                    //新元素插入
                        newArr[j+1]=newElement;                             
                    }
                }
            }
        }

        //遍历观察算法完成时的数组
        System.out.print("算法完成时的新数组");
        for (int i = 0; i < newArr.length; i++) {
            System.out.print(newArr[i]+" ");
        }
        System.out.println();

        return newArr[k-1];
    }

在main方法中测试运行:

public static void main(String[] args) {

        int[] arr = { 12, 23, 34, 45, 53, 98, 6, 68, 17, 80, 18, 29, 83, 59, 40 };

        //采用方法2,数组arr中第十个最大值
        System.out.println(readInAndReturn(10, arr));
    }

程序运行得到输出:
  算法完成时的新数组98 83 80 68 59 53 45 40 34 29
  29
返回为29。与方案1一样。

 这里完成了该问题的两种常规思路代码实现。对比两种方法,方案1的思路和代码都要稍简单,但是对于N是较大数据时,需要整体排序的方案1效率显然不够。而如果N足够大时,两种方法均不能在合理时间内解决。所以,这两种方法只适用于小数据范围的求解。

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

N个数中的第k个最大值 的相关文章

  • Eclipse使用JDBC方式连接SQLServer2016

    Eclipse使用JDBC方式连接SQLServer2016 今天下午在查找很多JDBC连接SQL时发现大多数都是2012甚至更久以前的版本 xff0c 所以就此把步骤记录下来 xff0c 以免自己下次使用又忘记了 在连接的时候 xff0c
  • 魔改《自动化学报》Latex模板

    想用latex写一个中文文档 xff0c 看上了 自动化学报 的模板 xff0c 感觉不错 xff0c 下载下来在本地的tex live上编译 xff0c 报了一大串错 xff1b 上传到overleaf xff0c 还是报错 xff1b
  • TX2安装jetpack

    目前官网支持的下载为JetPack L4T 3 2 1 linux x64 b23和JetPack L4T 3 3 linux x64 b39 首先使用具有Ubuntu16 04的host主机 xff08 我使用的是个人笔记本 xff0c
  • TF-IDF算法

    TF IDF算法 TF IDF term frequency inverse document frequency 是一种用于信息检索与数据挖掘的常用加权技术 xff0c 常用于挖掘文章中的关键词 xff0c 而且算法简单高效 xff0c
  • 大数据009——MapReduce

    分布式离线计算框架MapReduce MapReduce是一种编程模型 Hadoop MapReduce采用Master slave 结构 只要按照其编程规范 xff0c 只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序
  • MapReduce实例——wordcount(单词统计)

    1 MR实例开发整体流程 最简单的MapReduce应用程序至少包含 3 个部分 xff1a 一个 Map 函数 一个 Reduce 函数和一个 main 函数 在运行一个mapreduce计算任务时候 xff0c 任务过程被分为两个阶段
  • MapReduce实例——好友推荐

    1 实例介绍 好友推荐算法在实际的社交环境中应用较多 xff0c 比如qq软件中的 你可能认识的好友 或者是Facebook中的好友推介 好友推荐功能简单的说是这样一个需求 xff0c 预测某两个人是否认识 xff0c 并推荐为好友 xff
  • Hadoop源码分析——JobClient

    1 MapReduce作业处理过程概述 当用户使用Hadoop的Mapreduce计算模型来进行处理问题时 xff0c 用户只需要定义所需的Mapper和Reduce处理函数 xff0c 还有可能包括的Combiner Comparator
  • 大数据010——Hive

    1 Hive 概述 Hive 是建立在 Hadoop 上的数据仓库基础构架 它提供了一系列的工具 xff0c 可以用来进行数据提取转化加载 xff08 ETL xff09 xff0c 这是一种可以存储 查询和分析存储在 Hadoop 中的大
  • 大数据011——Sqoop

    1 Sqoop 概述 Sqoop是Hadoop和关系数据库服务器之间传送数据的一种工具 它是用来从关系数据库如 xff1a MySQL xff0c Oracle到Hadoop的HDFS xff0c 并从Hadoop的文件系统导出数据到关系数
  • 大数据012——HBase

    1 HBase 简介 HBase Hadoop Database xff0c 是一个高可靠性 高性能 面向列 可伸缩 实时读写的分布式数据库 xff1b 在Hadoop生态圈中 xff0c 它是其中一部分且利用Hadoop HDFS作为其文
  • Hadoop源码分析——MapReduce输入和输出

    Hadoop中的MapReduce库支持集中不同的格式的输入数据 例如 xff0c 文本模式的输入数据的每一行被视为一个key value键值对 key是文件的偏移量 xff0c value是那一行的内容 另一种常见的格式是以key进行排序
  • 大数据013——Flume

    1 Flume 简介 Flume是由Cloudera软件公司提供的一个高可用的 xff0c 高可靠的 xff0c 分布式的海量日志采集 聚合和传输的系统 xff0c 后与2009年被捐赠了apache软件基金会 xff0c 为hadoop相
  • Hadoop源码分析——计算模型MapReduce

    MapReduce 是一个计算模型 xff0c 也是一个处理和生成超大数据集的算法模型的相关实现 用户首先创建一个Map函数处理一个基于key value pair的数据集合 xff0c 输出中间的基于 key value pair 的数据
  • 从SDLC到DevSecOps的转变

    OSSTMM 根据开源安全测试方法手册OSSTMM Open Source Security Testing Methodology Manual 的表述 安全测试包括但不限于以下几种做法 漏洞扫描 安全扫描 渗透测试 风险评估 安全审核
  • 大数据014——Storm 简介及入门案例

    分布式实时数据处理框架 Storm 1 Storm简介与核心概念 1 1 Storm 简介 全称为 Apache Storm xff0c 是一个分布式实时大数据处理系统 它是一个流数据框架 xff0c 具有最高的获取率 它比较简单 xff0
  • Hive与HBase整合详解

    参考之前小节的大数据010 Hive与大数据012 HBase成功搭建Hive和HBase的环境 xff0c 并进行了相应的测试 xff0c 并且在大数据011 Sqoop中实现Hive HBase与MySQL之间的相互转换 xff1b 本
  • 大数据015——Elasticsearch基础

    1 Elasticsearch 简介 Elasticsearch是一个基于Lucene的实时的分布式搜索和分析 引擎 设计用于云计算中 xff0c 能够达到实时搜索 xff0c 稳定 xff0c 可靠 xff0c 快速 xff0c 安装使用

随机推荐

  • 大数据015——Elasticsearch深入

    1 Elasticsearch 核心概念 1 1 cluster 代表一个集群 xff0c 集群中有多个节点 xff0c 其中有一个为主节点 xff0c 这个主节点是可以通过选举产生的 xff0c 主从节点是对于集群内部来说的 es的一个重
  • 大数据014——Storm 集群及入门案例

    分布式实时数据处理框架 Storm 1 Storm 集群 1 1 Storm 版本变更 版本编写语言重要特性HA 高可用0 9 xjava 43 clojule改进与Kafka HDFS HBase的集成不支持 xff0c storm集群只
  • 大数据016——Kafka

    1 Kafka 简介 Kafka 是一个高吞吐量 低延迟分布式的消息队列系统 kafka 每秒可以处理几十万条消息 xff0c 它的延迟最低只有几毫秒 Kafka 也是一个高度可扩展的消息系统 xff0c 它在LinkedIn 的中央数据管
  • 大数据017——Scala基础

    Scala 是一门以 java 虚拟机 xff08 JVM xff09 为目标运行环境并将面向对象和函数式编程语言的最佳特性结合在一起的编程语言 你可以使用Scala 编写出更加精简的程序 xff0c 同时充分利用并发的威力 由于scala
  • 大数据017——Scala进阶

    Scala 基础语法 第二阶段 1 类和对象 1 1 类 1 xff09 简单类和无参方法 如下定义Scala类最简单形式 xff1a class Counter private var value 61 0 必须初始换字段 def inc
  • 大数据018——Spark(一)

    1 Spark 数据分析简介 1 1 Spark 是什么 Spark 是一个用来实现快速而通用的集群计算的平台 在速度方面 xff0c Spark 扩展了广泛使用的 MapReduce 计算模型 xff0c 而且高效地支持更多计算模式 xf
  • ROS 订阅RealsenseD435图像与opencv保存32位深度图像

    一 xff0c 通过ros订阅realsense图像 int main int argc char argv ros init argc argv 34 image listener 34 ros NodeHandle nh cv name
  • 测试左移和右移:不是左右逢源而是左右突击

    持续测试是在软件交付生命周期过程中 xff0c 以防控业务风险为目的 xff0c 将每一个业务交付阶段都辅以测试活动进行质量保障 xff0c 并尽最大可能自动化 xff0c 通过测试结果不断的反馈给制品过程的测试实践活动 随着持续测试实践的
  • 虚拟机ubuntu上安装make和cmake

    可先更新下apt xff1a sudo apt get update 首先安装make xff1a sudo apt get install ubuntu make sudo apt get install make sudo apt ge
  • ros学习笔记(十):树莓派 Ubuntu mate 16.04 开启vncserver 远程桌面+自启动+分辨率修改

    树莓派 Ubuntu mate 16 04 开启vncserver 远程桌面 43 自启动 43 分辨率修改 一 环境 1 树莓派3b 43 Ubuntu 16 04 mate 2 我是在win10 安装的 vncview 软件进行远程桌面
  • 梯度、散度、旋度的关系

    转自 百度文库https wenku baidu com view 681228626137ee06eff918c4 html 知乎上一篇不错的文章 https www zhihu com question 24591127 麦克斯韦方程组
  • 【瓣芽·Banya】React Native 构建的仿豆瓣应用

    今天介绍一个用 React Native 创建的应用 xff0c 集合了豆瓣电影 xff0c 图书等信息展示功能的 app github 地址 瓣芽 Banya 项目使用了react navigation 做路由 redux 做部分状态管理
  • CSS - position

    在 CSS 中 xff0c position 是实现元素定位的一种重要方式 使用定位的元素层叠级别比浮动会更高 xff0c 采用定位来控制元素位置会更加容易 一般我们使用定位 xff0c 是通过使用定位模式和边偏移量来确定元素位置的 定位模
  • React Native 选择器组件 / react-native-slidepicker

    react native slidepicker 一个纯 JavaScript 实现的的 React Native 组件 xff0c 用于如地址 xff0c 时间等分类数据选择的场景 github https github com lexg
  • 函数式组件 ref 的解决方案

    对于 React 中需要强制修改子组件的情况 xff0c React 提供了 Refs 这种解决办法 xff0c 使得我们可以操作底层 DOM 元素或者自定的 class 组件实例 除此之外 xff0c 文档 xff08 v17 0 1 x
  • JavaScript生成指定范围的随机数和随机数序列

    在JavaScript中我们经常使用Math random 方法生成随机数 xff0c 但是该方法生成的随机数只是0 1之间的随机数 先看如下常用方法的特征 xff1a 1 Math random 结果为0 1间的一个随机数 包括0 不包括
  • JavaScript生成指定范围随机数和随机序列

    在JavaScript中我们经常使用Math random 方法生成随机数 xff0c 但是该方法生成的随机数只是0 1之间的随机数 先看如下常用方法的特征 1 Math random 结果为0 1间的一个随机数 包括0 不包括1 2 Ma
  • 【React Native】JavaScript 中 bind 方法

    这个问题其实是一个 JavaScript 中的问题 JavaScript中jQury的bind方法为选定元素添加事件处理程序 xff0c 规定事件发生时运行的函数 语法为 xff1a selector bind event data fun
  • 分层自动化测试模型深入研究

    分层自动化测试模型的发展 分层自动化测试模型最早是由Mike Cohn在2009年出版的 Succeeding with Agile 书中的第十六章进行阐述的 他说 测试金字塔是分层测试的一种最佳实践 金字塔自动化测试模型如上图A所示 从下
  • N个数中的第k个最大值

    确定一组N个数中的第k个最大值 xff0c 这是数据结构和算法分析 java语言描述 中讨论的第一个问题 书中第一章也已给处两种常规思路 xff1a 1 xff0d 先将N个数的数组整体进行递减排序 xff0c 然后返回位置k 数组索引为k