热门标签 | 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



推荐阅读
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 深入理解排序算法:集合 1(编程语言中的高效排序工具) ... [详细]
  • 在关系型数据库中,数据约束是指在向数据表中插入数据时必须遵循的限制条件。在MySQL和MariaDB中,常见的数据约束包括主键约束、唯一键约束、外键约束以及非空约束等。这些约束确保了数据的完整性和一致性,是数据库管理中的重要组成部分。通过合理设置和使用这些约束,可以有效防止数据冗余和错误,提升数据库的可靠性和性能。 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • 本文详细探讨了JavaScript中数组去重的各种方法,并通过实际代码示例进行了深入解析。文章首先介绍了几种常见的去重技术,包括使用Set对象、过滤方法和双重循环等。每种方法都附有具体的实现代码,帮助读者更好地理解和应用这些技术。此外,文中还讨论了不同方法在性能上的优劣,为开发者提供了实用的参考。 ... [详细]
  • 本文全面解析了JavaScript中的DOM操作,并提供了详细的实践指南。DOM节点(Node)通常代表一个标签、文本或HTML属性,每个节点都具有一个nodeType属性,用于标识其类型。文章深入探讨了DOM节点的创建、查询、修改和删除等操作,结合实际案例,帮助读者更好地理解和掌握DOM编程技术。 ... [详细]
  • Python进阶笔记:深入理解装饰器、生成器与迭代器的应用
    本文深入探讨了Python中的装饰器、生成器和迭代器的应用。装饰器本质上是一个函数,用于在不修改原函数代码和调用方式的前提下为其添加额外功能。实现装饰器需要掌握闭包、高阶函数等基础知识。生成器通过 `yield` 语句提供了一种高效生成和处理大量数据的方法,而迭代器则是一种可以逐个访问集合中元素的对象。文章详细解析了这些概念的原理和实际应用案例,帮助读者更好地理解和使用这些高级特性。 ... [详细]
  • 利用 Zend Framework 实现高效邮件发送功能 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • 具备括号和分数功能的高级四则运算计算器
    本研究基于C语言开发了一款支持括号和分数运算的高级四则运算计算器。该计算器通过模拟手算过程,对每个运算符进行优先级标记,并按优先级从高到低依次执行计算。其中,加减运算的优先级最低,为0。此外,该计算器还支持复杂的分数运算,能够处理包含括号的表达式,提高了计算的准确性和灵活性。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 在Django中提交表单时遇到值错误问题如何解决?
    在Django项目中,当用户提交包含多个选择目标的表单时,可能会遇到值错误问题。本文将探讨如何通过优化表单处理逻辑和验证机制来有效解决这一问题,确保表单数据的准确性和完整性。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
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社区 版权所有