热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于快速排序思想partition查找第K大的数或者第K小的数。

快速排序下面是之前实现过的快速排序的代码。functionquickSort(a,left,right){if(leftright)return;letkeypartition(a

快速排序

下面是之前实现过的快速排序的代码。

function quickSort(a,left,right){if(left&#61;&#61;right)return;let key&#61;partition(a,left,right);//选出key下标if(left<key){quickSort(a,left,key-1);//对key的左半部分排序
}if(key<right){quickSort(a,key&#43;1,right)//对key的右半部份排序
}
}
function partition(a,left,right){let key&#61;a[left];//一开始让key为第一个数while(left//扫描一遍while(key<&#61;a[right]&&left//如果key小于a[right]&#xff0c;则right递减&#xff0c;继续比较right--;}[a[left],a[right]]&#61;[a[right],a[left]];//交换while(key>&#61;a[left]&&left//如果key大于a[left]&#xff0c;则left递增&#xff0c;继续比较left&#43;&#43;;}[a[left],a[right]]&#61;[a[right],a[left]];//交换
}return left;//把key现在所在的下标返回
}

 

明显我们可以看出快排的思想是每次找到一个基准数&#xff0c;将数组排列成基准数左边的每个数都比基准数大&#xff0c;右边的每个数都比基准数小的序列。 通过这个思想&#xff0c;我们可以稍微修改QuickSort函数&#xff0c;使它变成findKmax函数&#xff0c;使之拥有快速查找前k个最大的数。

基于快速排序思想查找第K大的数

function findKmax(a,k){let left&#61;0,right&#61;a.length-1;let key&#61;partition(a,left,right);let len&#61;a.length-key;while(len!&#61;k){if(len>k){key&#61;partition(a,key&#43;1,right);}else{key&#61;partition(a,left,key-1);}len&#61;a.length-key;}return a[key];
}
function partition(a,left,right){let key&#61;a[left];//一开始让key为第一个数while(left//扫描一遍while(key<&#61;a[right]&&left//如果key小于a[right]&#xff0c;则right递减&#xff0c;继续比较right--;}[a[left],a[right]]&#61;[a[right],a[left]];//交换while(key>&#61;a[left]&&left//如果key大于a[left]&#xff0c;则left递增&#xff0c;继续比较left&#43;&#43;;}[a[left],a[right]]&#61;[a[right],a[left]];//交换
}return left;//把key现在所在的下标返回
}

重点是要注意判定边界条件&#xff0c;left,right,k三个都在变&#xff0c;因此需要检验

同理&#xff0c;还可以求第K小的数

function findKmin(a,k){//查找第K小的数let left&#61;0,right&#61;a.length-1;let key&#61;partition(a,left,right);while(key!&#61;k-1){if(key>k-1){key&#61;partition(a,left,key-1);}else{key&#61;partition(a,key&#43;1,right);}}return a[key];
}
function partition(a,left,right){let key&#61;a[left];//一开始让key为第一个数while(left//扫描一遍while(key<&#61;a[right]&&left//如果key小于a[right]&#xff0c;则right递减&#xff0c;继续比较right--;}[a[left],a[right]]&#61;[a[right],a[left]];//交换while(key>&#61;a[left]&&left//如果key大于a[left]&#xff0c;则left递增&#xff0c;继续比较left&#43;&#43;;}[a[left],a[right]]&#61;[a[right],a[left]];//交换
}return left;//把key现在所在的下标返回
}

 

转:https://www.cnblogs.com/wuguanglin/p/searchKMax.html



推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 热血合击脚本辅助工具及随机数生成器源码分享
    本文分享了一个热血合击脚本辅助工具及随机数生成器源码。游戏脚本能够实现类似真实玩家的操作,但信息量有限且操作不可控。热血合击脚本辅助工具可以帮助玩家自动刷图、换图拉怪等操作,并提供了雷电云手机的扩展服务。此外,还介绍了使用mt_rand函数作为随机数生成器的代码示例。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
author-avatar
YooHoo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有