快速排序

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

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

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

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

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

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

同理,还可以求第K小的数

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

基于快速排序思想partition查找第K大的数或者第K小的数。的更多相关文章

  1. 主席树入门——询问区间第k大pos2104,询问区间<=k的元素个数hdu4417

    poj2104找了个板子..,但是各种IO还可以进行优化 /* 找区间[l,r]第k大的数 */ #include<iostream> #include<cstring> #i ...

  2. Coursera Algorithms week3 快速排序 练习测验: Selection in two sorted arrays(从两个有序数组中寻找第K大元素)

    题目原文 Selection in two sorted arrays. Given two sorted arrays a[] and b[], of sizes n1 and n2, respec ...

  3. 利用划分树求解整数区间内第K大的值

    如何快速求出(在log2n的时间复杂度内)整数区间[x,y]中第k大的值(x<=k<=y)? 其实我刚开始想的是用快排来查找,但是其实这样是不行的,因为会破坏原序列,就算另外一个数组来存储 ...

  4. 寻找数组中第K大的数

    给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大的数字.该方法的时间复杂度为O(N*logN) ...

  5. POJ 2104 K-th Number (区间第k大)

    题意:给定一个序列A,接下来又m个询问,每个询问输出A[L,R]中的第K大.(保证第k大存在) 思路: 我想拿来练习“可持久化线段树”的,搜到这个比较巧的算法也可以解决这个问题,叫“归并树?.大概的思 ...

  6. 第K大01背包

    其实这个问题,真的挺好想的,但是我咋想了那么久呢~~ 很好理解,第K大01背包一定基于01背包,dp数组也很容易的想到由dp[V]  ---->   dp[V][K],来表示背包容量是V时候的第 ...

  7. POJ 2104 K-th Number 主席树(区间第k大)

    题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...

  8. Count on a tree(SPOJ COT + 树上第k大 + 主席树 + LCA)

    题目链接:https://www.spoj.com/problems/COT/en/ 题目: 题意: 给你一棵有n个节点的树,求节点u到节点v这条链上的第k大. 思路: 我们首先用dfs进行建题目给的 ...

  9. 行列有序矩阵求第k大元素

    问题来源:http://www.careercup.com/question?id=6335704 问题描述: Given a N*N Matrix. All rows are sorted, and ...

随机推荐

  1. python模拟艺龙网登录带验证码输入

    1.使用urllib与urllib2包 2.使用cookielib自动管理cookie 3.360浏览器F12抓信息 登录请求地址和验证码地址都拿到了如图 # -*- coding: utf-8 -* ...

  2. openCV学习——一、图像读取、显示、输出

    openCV学习——一.图像读取.显示.输出   一.Mat imread(const string& filename,int flags=1),用于读取图片 1.参数介绍 filename ...

  3. Hibernate框架的第四天

    ## Hibernate框架的第四天 ## ---------- **回顾:Hibernate框架的第三天** 1. 一对多关联关系映射 * JavaBean的编写 * 编写映射的配置文件 * 使用级 ...

  4. 005-IIS处理过程

    PipeLine调用过程ISAPIRuntime ProcessReqeustHttpRuntime ProcessRequestNoDemand ProcessRequestNow ProcessR ...

  5. EL语言表达式 (二)【EL对数据的访问】

    一.访问方式: EL中访问数据和Java中访问数组的方式相同,即可以通过“[]”和“.”运算符进行访问.而且两种形式是等价的.如: 访问JavaBean对象userInfo中的id属性,可以写成下面两 ...

  6. UVa-116 Unidirectional TSP 单向旅行商

    题目 https://vjudge.net/problem/uva-116 分析 设d[i][j]为从(i,j)到最后一列的最小开销,则d[i][j]=a[i][j]+max(d[i+1][j+1], ...

  7. 解决lnmp服务器环境wordpress升级或安装插件主题要输入FTP的方法

    使用lnmp一键安装包搭建的服务器环境运行wordpress,在后台升级WP程序.安装或更新插件主题时,每时提示输入FTP信息,该问题的原因是nginx的执行身份用户组非文件用户组,前面博客吧使用虚拟 ...

  8. html中通过js获取接口JSON格式数据解析以及跨域问题

    前言:本人自学前端开发,一直想研究下js获取接口数据在html的实现,顺利地找到了获取数据的方法,但是有部分接口在调用中出现无法展示数据.经查,发现时跨域的问题,花费了一通时间,随笔记录下过程,以方便 ...

  9. hdu3037 lucas

    题意 :  给了n课不同的树,要求将 0,1,2,3,4,5,...m个松果,分别放在n棵树上的方案数有多少, 我们这样考虑, 如果将m个相同的松果 放入n棵树中 , 转化一下,我们让每个点至少放1个 ...

  10. Shell Necklace (dp递推改cdq分治 + fft)

    首先读出题意,然后发现这是一道DP,我们可以获得递推式为 然后就知道,不行啊,时间复杂度为O(n2),然后又可以根据递推式看出这里面可以拆解成多项式乘法,但是即使用了fft,我们还需要做n次多项式乘法 ...